Merge branch 'snowram/consumables-buffs' into 'master'

Allows for consumables to have an optional array of buffs and effects

See merge request veloren/veloren!1472
This commit is contained in:
Samuel Keiffer 2020-11-06 02:42:34 +00:00
commit 45e6fd5ad9
39 changed files with 435 additions and 160 deletions

View File

@ -1,9 +1,11 @@
ItemDef(
name: "Flask of Velorite Dust",
description: "Increases Exp by 250\n\nTake with plenty of water\n\n<Right-Click to use>",
description: "Increases Exp by 250\n\nTake with plenty of water",
kind: Consumable(
kind: "PotionExp",
effect: Xp(250),
effect: [
Xp(250),
]
),
quality: High,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Potent Potion",
description: "A potent healing potion.\n\nRestores 100 health on use.\n\n<Right-Click to use>",
description: "A potent healing potion.\n\nRestores 100 health on use",
kind: Consumable(
kind: "Potion",
effect: Health((
amount: 1000,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 1000.0,
duration: Some((
secs: 1,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: High,
)

View File

@ -1,9 +1,11 @@
ItemDef(
name: "Potion of Skill",
description: "Provides 250 XP to the drinker\n\n<Right-Click to use>",
description: "Provides 250 XP to the drinker",
kind: Consumable(
kind: "Potion",
effect: Xp(250),
),
effect: [
Xp(250),
]
),
quality: High,
)

View File

@ -3,10 +3,19 @@ ItemDef(
description: "Restores 100 Health",
kind: Consumable(
kind: "PotionLarge",
effect: Health((
amount: 1000,
cause: Item,
)),
effect: [
Buff((
kind: Potion,
data: (
strength: 1000.0,
duration: Some((
secs: 1,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -3,10 +3,19 @@ ItemDef(
description: "Restores 70 Health",
kind: Consumable(
kind: "PotionMed",
effect: Health((
amount: 700,
cause: Item,
)),
effect: [
Buff((
kind: Potion,
data: (
strength: 700.0,
duration: Some((
secs: 1,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -3,10 +3,19 @@ ItemDef(
description: "Restores 50 Health",
kind: Consumable(
kind: "PotionMinor",
effect: Health((
amount: 500,
cause: Item,
)),
effect: [
Buff((
kind: Potion,
data: (
strength: 500.0,
duration: Some((
secs: 1,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Apple",
description: "Restores 10 Health\n\nRed and juicy",
description: "Restores 10 Health over 20 seconds\n\nRed and juicy",
kind: Consumable(
kind: "Apple",
effect: Health((
amount: 100,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 5.0,
duration: Some((
secs: 20,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Mushroom Curry",
description: "Restores 120 Health\n\nWho could say no to that?",
description: "Restores 120 Health over 20 seconds\n\nWho could say no to that?",
kind: Consumable(
kind: "AppleShroomCurry",
effect: Health((
amount: 1200,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 60.0,
duration: Some((
secs: 20,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Moderate,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Apple Stick",
description: "Restores 25 Health\n\nThe stick makes it easier to carry!",
description: "Restores 25 Health over 20 seconds\n\nThe stick makes it easier to carry!",
kind: Consumable(
kind: "AppleStick",
effect: Health((
amount: 250,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 12.5,
duration: Some((
secs: 20,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Dwarven Cheese",
description: "Restores 15 Health\n\nAromatic and nutritious",
description: "Restores 15 Health over 20 seconds\n\nAromatic and nutritious",
kind: Consumable(
kind: "Cheese",
effect: Health((
amount: 150,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 7.5,
duration: Some((
secs: 20,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Coconut",
description: "Restores 20 health\n\nReliable source of water and fat",
description: "Restores 20 health over 20 seconds\n\nReliable source of water and fat",
kind: Consumable(
kind: "Coconut",
effect: Health((
amount: 200,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 10.0,
duration: Some((
secs: 20,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Mushroom",
description: "Restores 5 Health\n\nHopefully this one is not poisonous",
description: "Restores 5 Health over 10 seconds\n\nHopefully this one is not poisonous",
kind: Consumable(
kind: "Mushroom",
effect: Health((
amount: 50,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 5.0,
duration: Some((
secs: 10,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Mushroom Stick",
description: "Restores 20 Health\n\nRoasted mushrooms on a stick for easy carrying.",
description: "Restores 20 Health over 20 seconds\n\nRoasted mushrooms on a stick for easy carrying",
kind: Consumable(
kind: "MushroomStick",
effect: Health((
amount: 200,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 10.0,
duration: Some((
secs: 20,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Common,
)

View File

@ -1,12 +1,21 @@
ItemDef(
name: "Sunflower Ice Tea",
description: "Restores 50 Health\n\nBrewed from freshly shelled sunflower seeds.",
description: "Restores 50 Health over 20 seconds\n\nBrewed from freshly shelled sunflower seeds",
kind: Consumable(
kind: "SunflowerTea",
effect: Health((
amount: 500,
cause: Item,
)),
effect: [
Buff((
kind: Saturation,
data: (
strength: 25.0,
duration: Some((
secs: 20,
nanos: 0,
)),
),
cat_ids: [Natural],
)),
]
),
quality: Moderate,
)

View File

@ -3,7 +3,9 @@ ItemDef(
description: "Increases Exp by 20\n\nJust a slight touch makes you feel the knowledge of ancient times",
kind: Consumable(
kind: "Velorite",
effect: Xp(20),
),
quality: High,
effect: [
Xp(20),
]
),
quality: High,
)

View File

@ -3,7 +3,9 @@ ItemDef(
description: "Increases Exp by 10\n\nSmall runes sparkle on its surface",
kind: Consumable(
kind: "VeloriteFrag",
effect: Xp(10),
effect: [
Xp(10),
]
),
quality: Moderate,
quality: Moderate,
)

View File

@ -6,7 +6,7 @@
// Ore and more
"velorite_frag": (("common.items.ore.veloritefrag", 2), [("common.items.ore.velorite", 1), ("common.items.crafting_tools.craftsman_hammer", 0)]),
//Potions
"potion_s": (("common.items.consumable.potion_minor", 1), [("common.items.crafting_ing.empty_vial", 1), ("common.items.ore.veloritefrag", 2)]),
"potion_s": (("common.items.consumable.potion_minor", 1), [("common.items.crafting_ing.empty_vial", 1), ("common.items.food.apple", 4), ("common.items.crafting_ing.honey", 1)]),
"potion_m": (("common.items.consumable.potion_med", 1), [("common.items.consumable.potion_minor", 2), ("common.items.ore.veloritefrag", 4)]),
"collar_basic": (("common.items.utility.collar", 1), [("common.items.crafting_ing.leather_scraps", 5), ("common.items.crafting_ing.shiny_gem", 1)]),
"bomb_coconut": (("common.items.utility.bomb", 1), [("common.items.crafting_ing.stones", 10), ("common.items.food.coconut", 2), ("common.items.ore.veloritefrag", 2), ("common.items.crafting_tools.mortar_pestle", 0)]),

View File

@ -65,7 +65,7 @@
],
threshold: 0.5,
),
Glide: (
Glide: (
files: [
// Event Missing or not implemented?
],
@ -383,6 +383,30 @@
],
threshold: 0.3,
),
Inventory(Consumed("PotionMed")): (
files: [
"voxygen.audio.sfx.inventory.consumable.liquid",
],
threshold: 0.3,
),
Inventory(Consumed("PotionLarge")): (
files: [
"voxygen.audio.sfx.inventory.consumable.liquid",
],
threshold: 0.3,
),
Inventory(Consumed("PotionExp")): (
files: [
"voxygen.audio.sfx.inventory.consumable.liquid",
],
threshold: 0.3,
),
Inventory(Consumed("SunflowerTea")): (
files: [
"voxygen.audio.sfx.inventory.consumable.liquid",
],
threshold: 0.3,
),
Inventory(Consumed("Apple")): (
files: [
"voxygen.audio.sfx.inventory.consumable.apple",
@ -401,6 +425,42 @@
],
threshold: 0.3,
),
Inventory(Consumed("AppleShroomCurry")): (
files: [
"voxygen.audio.sfx.inventory.consumable.food",
],
threshold: 0.3,
),
Inventory(Consumed("AppleStick")): (
files: [
"voxygen.audio.sfx.inventory.consumable.food",
],
threshold: 0.3,
),
Inventory(Consumed("Coconut")): (
files: [
"voxygen.audio.sfx.inventory.consumable.food",
],
threshold: 0.3,
),
Inventory(Consumed("MushroomStick")): (
files: [
"voxygen.audio.sfx.inventory.consumable.food",
],
threshold: 0.3,
),
Inventory(Consumed("Velorite")): (
files: [
"voxygen.audio.sfx.inventory.consumable.food",
],
threshold: 0.3,
),
Inventory(Consumed("VeloriteFrag")): (
files: [
"voxygen.audio.sfx.inventory.consumable.food",
],
threshold: 0.3,
),
Explosion: (
files: [
// in code

BIN
assets/voxygen/element/icons/de_buffs/buff_potion_0.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/element/icons/de_buffs/buff_saturation_0.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -1,5 +1,5 @@
/// Translation document instructions
///
///
/// In order to keep localization documents readible please follow the following
/// rules:
/// - separate the string map sections using a commentary describing the purpose
@ -120,7 +120,7 @@ Dies ist eine frühe Alpha. Ihr werdet auf Bugs, unfertiges Gameplay und Mechani
Für konstruktives Feedback und Bug-Reports könnt Ihr uns via Reddit, Gitlab oder unseren Discord Server kontaktieren.
Veloren hat die GPL 3 Open-Source Lizenz. Das heißt Ihr könnt es kostenlos spielen,
Veloren hat die GPL 3 Open-Source Lizenz. Das heißt Ihr könnt es kostenlos spielen,
aber auch modifizieren (solange die Mods auch die selbe Lizenz tragen) und das Spiel an andere weiterschicken.
Veloren ist ein Non-Profit Community Projekt und jeder Mitarbeiter entwickelt es als Hobby in seiner Freizeit.
@ -164,7 +164,7 @@ https://account.veloren.net.
"hud.quests": "Quests",
"hud.you_died": "Ihr seid gestorben.",
"hud.waypoint_saved": "Wegpunkt gesichert",
"hud.press_key_to_show_keybindings_fmt": "[{key}] Tastenbelegung",
"hud.press_key_to_toggle_lantern_fmt": "[{key}] Laterne",
"hud.press_key_to_show_debug_info_fmt": "Drückt {key} um die Debug-Info zu zeigen",
@ -172,13 +172,13 @@ https://account.veloren.net.
"hud.press_key_to_toggle_debug_info_fmt": "Drückt {key} um die Debug-Info zu zeigen",
// Chat outputs
"hud.chat.online_msg": "[{name}] ist jetzt online.",
"hud.chat.offline_msg": "{name} ist jetzt offline.",
"hud.chat.loot_msg": "Ihr erhaltet [{item}]",
"hud.chat.online_msg": "[{name}] ist jetzt online.",
"hud.chat.offline_msg": "{name} ist jetzt offline.",
"hud.chat.loot_msg": "Ihr erhaltet [{item}]",
"hud.chat.loot_fail": "Euer Inventar ist voll!",
"hud.chat.goodbye": "Verbindung getrennt.",
"hud.chat.connection_lost": "Verbindung unterbrochen. Trenne Verbindung in {time} Sekunden.",
"hud.chat.default_death_msg": "[{name}] ist gestorben",
"hud.chat.environmental_kill_msg": "[{name}] starb durch {environment}",
"hud.chat.fall_kill_msg": "[{name}] starb durch Fallschaden",
@ -224,7 +224,7 @@ Um diese zu nutzen öffnet Euer Inventar mit 'B'.
Doppelklickt den Gegenstand in Eurer Tasche, um diesen zu nutzen.
Um Items wegzuwerfen klickt sie einmal im Inventar an
Um Items wegzuwerfen klickt sie einmal im Inventar an
und klickt dann außerhalb der Tasche.
@ -246,11 +246,11 @@ Viel Spaß in der Welt von Veloren, Abenteurer!"#,
um unsere Dörfer herum aufgetaucht!
Versammelt einige Kämpfer, sucht etwas
Nahrung und besiegt ihre abscheulichen
Versammelt einige Kämpfer, sucht etwas
Nahrung und besiegt ihre abscheulichen
Anführer und Akolyten.
Vielleicht könnt Ihr sogar einen ihrer
Vielleicht könnt Ihr sogar einen ihrer
magischen Gegenstände ergattern?"#,
// Inventory
@ -273,7 +273,7 @@ magischen Gegenstände ergattern?"#,
"hud.bag.legs": "Beine",
"hud.bag.feet": "Füße",
"hud.bag.mainhand": "Haupthand",
"hud.bag.offhand": "Nebenhand",
"hud.bag.offhand": "Nebenhand",
// Map and Questlog
"hud.map.map_title": "Karte",
@ -292,7 +292,7 @@ magischen Gegenstände ergattern?"#,
"hud.settings.custom_scaling": "Freie Skalierung",
"hud.settings.crosshair": "Fadenkreuz",
"hud.settings.transparency": "Transparenz",
"hud.settings.hotbar": "Hotbar",
"hud.settings.hotbar": "Hotbar",
"hud.settings.toggle_shortcuts": "Tastenbelegung",
"hud.settings.toggle_bar_experience": "Erfahrungsleiste",
"hud.settings.scrolling_combat_text": "Aufsteigende Kampfwerte",
@ -300,7 +300,7 @@ magischen Gegenstände ergattern?"#,
"hud.settings.cumulated_damage": "Addierter Schaden",
"hud.settings.incoming_damage": "Erlittener Schaden",
"hud.settings.cumulated_incoming_damage": "Addierter erlittener Schaden",
"hud.settings.speech_bubble": "Sprechblase",
"hud.settings.speech_bubble": "Sprechblase",
"hud.settings.speech_bubble_dark_mode": "Dunkle Sprechblasen",
"hud.settings.speech_bubble_icon": "Sprechblasen-Symbole",
"hud.settings.energybar_numbers": "Zahlen auf Ressourcenanzeige",
@ -311,10 +311,10 @@ magischen Gegenstände ergattern?"#,
"hud.settings.chat_character_name": "Characternamen im Chat",
"hud.settings.buffs_mmap": "Zeige Buffs an der Mini-Map",
"hud.settings.buffs_skillbar": "Zeige Buffs an der Fähigkeiten Leiste",
"hud.settings.cloud_rendering_mode.low": "Niedrig",
"hud.settings.cloud_rendering_mode.low": "Niedrig",
"hud.settings.cloud_rendering_mode.medium": "Mittel",
"hud.settings.cloud_rendering_mode.minimal": "Minimal",
"hud.settings.cloud_rendering_mode.high": "Hoch",
"hud.settings.cloud_rendering_mode.minimal": "Minimal",
"hud.settings.cloud_rendering_mode.high": "Hoch",
"hud.settings.pan_sensitivity": "Schwenk-Sensibilität",
"hud.settings.zoom_sensitivity": "Zoom-Sensibilität",
@ -341,7 +341,7 @@ magischen Gegenstände ergattern?"#,
"hud.settings.resolution": "Auflösung",
"hud.settings.bit_depth": "Bittiefe",
"hud.settings.refresh_rate": "Bildwiederholrate",
"hud.settings.fullscreen": "Vollbild",
"hud.settings.fullscreen": "Vollbild",
"hud.settings.fullscreen_mode": "Vollbild-Modus",
"hud.settings.fullscreen_mode.exclusive": "Exklusiv",
"hud.settings.fullscreen_mode.borderless": "Rahmenlos",
@ -374,7 +374,7 @@ magischen Gegenstände ergattern?"#,
"hud.social.account": "Account",
"hud.spell": "Zauber",
"hud.social.name" : "Name",
"hud.social.level" : "Lvl",
"hud.social.zone" : "Gebiet",
@ -401,13 +401,13 @@ magischen Gegenstände ergattern?"#,
"hud.free_look_indicator": "Freie Sicht aktiv",
"hud.auto_walk_indicator": "Automatisches Laufen aktiv",
/// End HUD section
/// Start GameInput section
"gameinput.primary": "Linker mittlerer Slot",
"gameinput.secondary": "Rechter mittlerer Slot",
"gameinput.slot1": "Hotbar Slot 1",
"gameinput.slot1": "Hotbar Slot 1",
"gameinput.slot2": "Hotbar Slot 2",
"gameinput.slot3": "Hotbar Slot 3",
"gameinput.slot4": "Hotbar Slot 4",
@ -450,7 +450,7 @@ magischen Gegenstände ergattern?"#,
"gameinput.charge": "Anstürmen",
"gameinput.togglewield": "Waffe ziehen/wegstecken",
"gameinput.interact": "Interagieren",
"gameinput.freelook": "Freie Sicht",
"gameinput.freelook": "Freie Sicht",
"gameinput.autowalk": "Automatisch Laufen",
"gameinput.dance": "Tanzen",
"gameinput.declinegroupinvite": "Ablehnen",
@ -501,7 +501,7 @@ Willenskraft
/// Start character window section
/// Start Escape Menu Section
"esc_menu.logout": "Ausloggen",
@ -510,14 +510,14 @@ Willenskraft
/// Buffs and Debuffs
"buff.remove": "Klicken zum Entfernen",
"buff.title.missing": "Fehlender Titel",
"buff.desc.missing": "Fehlende Beschreibung",
"buff.title.missing": "Fehlender Titel",
"buff.desc.missing": "Fehlende Beschreibung",
// Buffs
"buff.title.heal_test": "HoT Buff Test",
"buff.desc.heal_test": "HoT Buff Test",
// Debuffs
"debuff.title.bleed_test": "Blutung",
"debuff.desc.bleed_test": "Fügt regelmäßig Schaden zu.",
"buff.title.heal": "HoT Buff Test",
"buff.desc.heal": "HoT Buff Test",
// Debuffs
"debuff.title.bleed": "Blutung",
"debuff.desc.bleed": "Fügt regelmäßig Schaden zu.",
},
vector_map: {
@ -530,17 +530,17 @@ Willenskraft
"NPCs mit demselben Level können unterschiedlich schwierig zu besiegen sein.",
"Behaltet den Boden um euch im Blick! Dort gibt es Nahrung, Kisten und Anderes zu finden.",
"Ist Euer Inventar voll mit Nahrung? Wertet es einfach durch Crafting auf!",
"Ihr sucht nach einem Abenteuer? Dungeons sind mit braunen Markierungen auf der Karte vermerkt!",
"Ihr sucht nach einem Abenteuer? Dungeons sind mit braunen Markierungen auf der Karte vermerkt!",
"Vergesst nicht Eure Grafikeinstellungen anzupassen! Mit 'N' kommt ihr in die Einstellungen.",
"Zusammen kämpfen macht mehr Spaß! Drückt 'O' um Eure Mitspieler anzuzeigen.",
"Zusammen kämpfen macht mehr Spaß! Drückt 'O' um Eure Mitspieler anzuzeigen.",
"Ein NPC mit einem Schädel unter seiner Lebensanzeige ist deutlich stärker als Ihr.",
"Drückt 'J' um zu tanzen. Yeah!",
"Verwendet 'L-Shift' um mit Eurem Gleiter den Himmel zu erobern!",
"Veloren befindet sich noch in der Pre-Alpha Phase. Wir tun unser Bestes, um das Spielgefühl jeden Tag zu verbessern!",
"Ihr wünscht, Euch mit uns auszutauschen oder wollt unserem Entwickler-Team beitreten? Kommt doch einfach auf unseren Discord-Server!",
],
"Ihr wünscht, Euch mit uns auszutauschen oder wollt unserem Entwickler-Team beitreten? Kommt doch einfach auf unseren Discord-Server!",
],
"npc.speech.villager_under_attack": [
"Hilfe, ich werde angegriffen!",
"Hilfe, ich werde angegriffen!",
],
}
)

View File

@ -184,7 +184,7 @@ https://account.veloren.net."#,
"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.pvp_other_kill_msg": "[{attacker}] killed [{victim}]",
"hud.chat.pvp_buff_kill_msg": "[{attacker}] killed [{victim}]",
"hud.chat.npc_melee_kill_msg": "{attacker} killed [{victim}]",
@ -520,11 +520,15 @@ Protection
"buff.title.missing": "Missing Title",
"buff.desc.missing": "Missing Description",
// Buffs
"buff.title.heal_test": "Heal Test",
"buff.desc.heal_test": "This is a test buff to test healing.",
"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.",
// Debuffs
"debuff.title.bleed_test": "Bleeding",
"debuff.desc.bleed_test": "Inflicts regular damage.",
"debuff.title.bleed": "Bleeding",
"debuff.desc.bleed": "Inflicts regular damage.",
},

View File

@ -1,5 +1,5 @@
/// Translation document instructions
///
///
/// In order to keep localization documents readible please follow the following
/// rules:
/// - separate the string map sections using a commentary describing the purpose
@ -7,7 +7,7 @@
/// - prepend multi-line strings with a commentary
/// - append one blank lines after a multi-line strings and two after sections
///
/// To add a new language in Veloren, just write an additional `.ron` file in
/// To add a new language in Veloren, just write an additional `.ron` file in
/// `assets/voxygen/i18n` and that's it!
///
/// WARNING: Localization files shall be saved in UTF-8 format without BOM
@ -164,7 +164,7 @@ bir hesap oluşturabilirsin."#,
"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 yakıp 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",
@ -203,7 +203,7 @@ bir hesap oluşturabilirsin."#,
"hud.sct.block": "BLOKLANDI",
// Respawn message
"hud.press_key_to_respawn": r#"Ziyaret ettiğin en son kamp ateşinde yeniden doğmak için {key}'e bas."#,
"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!,
@ -250,7 +250,7 @@ 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ı
Kim bilir? Belki onların tılsımlı
eşyalarını bile ele geçirebilirsin!"#,
@ -275,7 +275,7 @@ eşyalarını bile ele geçirebilirsin!"#,
"hud.bag.feet": "Ayaklar",
"hud.bag.mainhand": "Birincil",
"hud.bag.offhand": "İkincil",
// Map and Questlog
"hud.map.map_title": "Harita",
"hud.map.qlog_title": "Görevler",
@ -462,7 +462,7 @@ edince kapat"#,
"gameinput.sneak": "Eğil",
"gameinput.swimdown": "Aşağı Dal",
"gameinput.swimup": "Yüzeye çık",
/// End GameInput section
@ -508,7 +508,7 @@ Koruma
/// Start character window section
/// Start Escape Menu Section
"esc_menu.logout": "Çıkış yap",
@ -520,11 +520,11 @@ Koruma
"buff.title.missing": "İsim Yok",
"buff.desc.missing": "Açıklama Yok",
// Buffs
"buff.title.heal_test": "İyileştirme Testi",
"buff.desc.heal_test": "Bu etki iyileştirmeyi test etmek için.",
"buff.title.heal": "İyileştirme Testi",
"buff.desc.heal": "Bu etki iyileştirmeyi test etmek için.",
// Debuffs
"debuff.title.bleed_test": "Kanama",
"debuff.desc.bleed_test": "Normal hasar verir.",
"debuff.title.bleed": "Kanama",
"debuff.desc.bleed": "Normal hasar verir.",
},
vector_map: {

View File

@ -1983,4 +1983,26 @@ Beehive: Some((
],
wind_sway: 0.1,
)),
// Empty Flask
VialEmpty: Some((
variations: [
(
model: "voxygen.voxel.object.potion_empty",
offset: (-5.0, -5.0, 0.0),
lod_axes: (1.0, 1.0, 1.0),
),
],
wind_sway: 0.0,
)),
// Minor Potion
PotionMinor: Some((
variations: [
(
model: "voxygen.voxel.object.potion_red",
offset: (-5.0, -5.0, 0.0),
lod_axes: (1.0, 1.0, 1.0),
),
],
wind_sway: 0.0,
)),
)

View File

@ -276,7 +276,7 @@ impl Body {
_ => 1000,
},
Body::Object(_) => 10000,
Body::Golem(_) => 2560,
Body::Golem(_) => 2740,
Body::Theropod(_) => 50,
Body::QuadrupedLow(quadruped_low) => match quadruped_low.species {
quadruped_low::Species::Crocodile => 600,

View File

@ -10,11 +10,15 @@ use std::{cmp::Ordering, collections::HashMap, time::Duration};
pub enum BuffKind {
/// Restores health/time for some period
Regeneration,
/// Restores health/time for some period for consumables
Saturation,
/// Lowers health over time for some duration
Bleeding,
/// Lower a creature's max health
/// Currently placeholder buff to show other stuff is possible
Cursed,
// Applied when drinking a potion
Potion,
}
impl BuffKind {
@ -22,14 +26,16 @@ impl BuffKind {
pub fn is_buff(self) -> bool {
match self {
BuffKind::Regeneration { .. } => true,
BuffKind::Saturation { .. } => true,
BuffKind::Bleeding { .. } => false,
BuffKind::Cursed { .. } => false,
BuffKind::Potion { .. } => true,
}
}
}
// Struct used to store data relevant to a buff
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct BuffData {
pub strength: f32,
pub duration: Option<Duration>,
@ -97,7 +103,7 @@ pub enum BuffChange {
RemoveById(Vec<BuffId>),
/// Removes buffs of these categories (first vec is of categories of which
/// all are required, second vec is of categories of which at least one is
/// required, third vec is of categories that will not be removed)
/// required, third vec is of categories that will not be removed)
RemoveByCategory {
all_required: Vec<BuffCategory>,
any_required: Vec<BuffCategory>,
@ -121,7 +127,7 @@ impl Buff {
}],
data.duration,
),
BuffKind::Regeneration => (
BuffKind::Regeneration | BuffKind::Saturation | BuffKind::Potion => (
vec![BuffEffect::HealthChangeOverTime {
rate: data.strength,
accumulated: 0.0,

View File

@ -83,7 +83,7 @@ pub enum ItemKind {
Glider(Glider),
Consumable {
kind: String,
effect: Effect,
effect: Vec<Effect>,
},
Throwable {
kind: Throwable,
@ -337,6 +337,8 @@ impl Item {
SpriteKind::Stones => "common.items.crafting_ing.stones",
SpriteKind::Twigs => "common.items.crafting_ing.twigs",
SpriteKind::ShinyGem => "common.items.crafting_ing.shiny_gem",
SpriteKind::VialEmpty => "common.items.crafting_ing.empty_vial",
SpriteKind::PotionMinor => "common.items.consumable.potion_minor",
_ => return None,
}))
}

View File

@ -260,8 +260,10 @@ impl Default for Inventory {
slots: vec![None; 36],
amount: 0,
};
inventory.push(Item::new_from_asset_expect(
"common.items.consumable.potion_minor",
));
inventory.push(Item::new_from_asset_expect("common.items.food.cheese"));
inventory.push(Item::new_from_asset_expect("common.items.food.apple"));
inventory
}
}

View File

@ -2,11 +2,20 @@ use crate::{combat, comp};
use serde::{Deserialize, Serialize};
/// An effect that may be applied to an entity
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Effect {
Health(comp::HealthChange),
Xp(i64),
Damage(combat::Damage),
Buff(BuffEffect),
}
/// A buff that may be applied to an entity
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct BuffEffect {
pub kind: comp::BuffKind,
pub data: comp::BuffData,
pub cat_ids: Vec<comp::BuffCategory>,
}
impl Effect {
@ -15,6 +24,7 @@ impl Effect {
Effect::Health(c) => format!("{:+} health", c.amount),
Effect::Xp(n) => format!("{:+} exp", n),
Effect::Damage(d) => format!("{:+}", d.value),
Effect::Buff(e) => format!("{:?} buff", e),
}
}
@ -29,6 +39,9 @@ impl Effect {
Effect::Damage(damage) => {
damage.interpolate_damage(modifier, 0.0);
},
Effect::Buff(effect) => {
effect.data.strength *= modifier;
},
}
}
}

View File

@ -102,6 +102,8 @@ make_case_elim!(
Reed = 0x4C,
Beehive = 0x4D,
LargeCactus = 0x4E,
VialEmpty = 0x4F,
PotionMinor = 0x50,
}
);
@ -184,6 +186,8 @@ impl SpriteKind {
SpriteKind::ShinyGem => true,
SpriteKind::Crate => true,
SpriteKind::Beehive => true,
SpriteKind::VialEmpty => true,
SpriteKind::PotionMinor => true,
_ => false,
}
}
@ -221,6 +225,8 @@ impl SpriteKind {
| SpriteKind::DropGateBottom
| SpriteKind::Door
| SpriteKind::Beehive
| SpriteKind::PotionMinor
| SpriteKind::VialEmpty
)
}
}

View File

@ -649,7 +649,7 @@ pub fn handle_explosion(
if is_alive {
effect.modify_strength(strength);
server.state().apply_effect(entity_b, effect, owner);
server.state().apply_effect(entity_b, effect.clone(), owner);
// Apply energy change
if let Some(owner) = owner_entity {
if let Some(energy) =

View File

@ -211,7 +211,7 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv
} else if let Some(item) = inventory.take(slot) {
match item.kind() {
ItemKind::Consumable { kind, effect, .. } => {
maybe_effect = Some(*effect);
maybe_effect = Some(effect.clone());
Some(comp::InventoryUpdateEvent::Consumed(kind.clone()))
},
ItemKind::Throwable { kind, .. } => {
@ -348,8 +348,10 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv
};
drop(inventories);
if let Some(effect) = maybe_effect {
state.apply_effect(entity, effect, None);
if let Some(effects) = maybe_effect {
for effect in effects {
state.apply_effect(entity, effect, None);
}
}
if let Some(event) = event {
state.write_component(entity, comp::InventoryUpdate::new(event));

View File

@ -71,8 +71,8 @@ pub trait StateExt {
}
impl StateExt for State {
fn apply_effect(&self, entity: EcsEntity, effect: Effect, source: Option<Uid>) {
match effect {
fn apply_effect(&self, entity: EcsEntity, effects: Effect, source: Option<Uid>) {
match effects {
Effect::Health(change) => {
self.ecs()
.write_storage::<comp::Health>()
@ -93,6 +93,19 @@ impl StateExt for State {
.get_mut(entity)
.map(|health| health.change_by(change));
},
Effect::Buff(buff) => {
self.ecs()
.write_storage::<comp::Buffs>()
.get_mut(entity)
.map(|buffs| {
buffs.insert(comp::Buff::new(
buff.kind,
buff.data,
buff.cat_ids,
comp::BuffSource::Item,
))
});
},
}
}

View File

@ -138,7 +138,7 @@ impl<'a> System<'a> for Sys {
body,
);
}
stats.level.set_level(rand::thread_rng().gen_range(30, 35));
stats.level.set_level(rand::thread_rng().gen_range(25, 30));
scale = 2.0 + rand::random::<f32>();
}

View File

@ -182,6 +182,8 @@ impl<'a> Widget for BuffsBar<'a> {
}) as u32; // Percentage to determine which frame of the timer overlay is displayed
let buff_img = match buff.kind {
BuffKind::Regeneration { .. } => self.imgs.buff_plus_0,
BuffKind::Saturation { .. } => self.imgs.buff_saturation_0,
BuffKind::Potion { .. } => self.imgs.buff_potion_0,
_ => self.imgs.missing_icon,
};
let buff_widget = Image::new(buff_img).w_h(20.0, 20.0);
@ -204,9 +206,11 @@ impl<'a> Widget for BuffsBar<'a> {
.set(id, ui);
// Create Buff tooltip
let title = match buff.kind {
BuffKind::Regeneration { .. } => {
localized_strings.get("buff.title.heal_test")
BuffKind::Regeneration { .. } => localized_strings.get("buff.title.heal"),
BuffKind::Saturation { .. } => {
localized_strings.get("buff.title.saturation")
},
BuffKind::Potion { .. } => localized_strings.get("buff.title.potion"),
_ => localized_strings.get("buff.title.missing"),
};
let remaining_time = if current_duration.is_none() {
@ -216,9 +220,11 @@ impl<'a> Widget for BuffsBar<'a> {
};
let click_to_remove = format!("<{}>", &localized_strings.get("buff.remove"));
let desc_txt = match buff.kind {
BuffKind::Regeneration { .. } => {
localized_strings.get("buff.desc.heal_test")
BuffKind::Regeneration { .. } => localized_strings.get("buff.desc.heal"),
BuffKind::Saturation { .. } => {
localized_strings.get("buff.desc.saturation")
},
BuffKind::Potion { .. } => localized_strings.get("buff.desc.potion"),
_ => localized_strings.get("buff.desc.missing"),
};
let desc = format!("{}\n\n{}\n\n{}", desc_txt, remaining_time, click_to_remove);
@ -296,9 +302,7 @@ impl<'a> Widget for BuffsBar<'a> {
.set(id, ui);
// Create Debuff tooltip
let title = match debuff.kind {
BuffKind::Bleeding { .. } => {
localized_strings.get("debuff.title.bleed_test")
},
BuffKind::Bleeding { .. } => localized_strings.get("debuff.title.bleed"),
_ => localized_strings.get("buff.title.missing"),
};
let remaining_time = if current_duration.is_none() {
@ -307,9 +311,7 @@ impl<'a> Widget for BuffsBar<'a> {
format!("Remaining: {:.0}s", current_duration.unwrap().as_secs_f32())
};
let desc_txt = match debuff.kind {
BuffKind::Bleeding { .. } => {
localized_strings.get("debuff.desc.bleed_test")
},
BuffKind::Bleeding { .. } => localized_strings.get("debuff.desc.bleed"),
_ => localized_strings.get("debuff.desc.missing"),
};
let desc = format!("{}\n\n{}", desc_txt, remaining_time);
@ -379,8 +381,10 @@ impl<'a> Widget for BuffsBar<'a> {
}) as u32;
let buff_img = match buff.kind {
BuffKind::Regeneration { .. } => self.imgs.buff_plus_0,
BuffKind::Saturation { .. } => self.imgs.buff_saturation_0,
BuffKind::Bleeding { .. } => self.imgs.debuff_bleed_0,
BuffKind::Cursed { .. } => self.imgs.debuff_skull_0,
BuffKind::Potion { .. } => self.imgs.buff_potion_0,
};
let buff_widget = Image::new(buff_img).w_h(40.0, 40.0);
// Sort buffs into rows of 6 slots
@ -402,12 +406,12 @@ impl<'a> Widget for BuffsBar<'a> {
.set(id, ui);
// Create Buff tooltip
let title = match buff.kind {
BuffKind::Regeneration { .. } => {
localized_strings.get("buff.title.heal_test")
},
BuffKind::Bleeding { .. } => {
localized_strings.get("debuff.title.bleed_test")
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::Bleeding { .. } => localized_strings.get("debuff.title.bleed"),
_ => localized_strings.get("buff.title.missing"),
};
let remaining_time = if current_duration.is_none() {
@ -417,12 +421,12 @@ impl<'a> Widget for BuffsBar<'a> {
};
let click_to_remove = format!("<{}>", &localized_strings.get("buff.remove"));
let desc_txt = match buff.kind {
BuffKind::Regeneration { .. } => {
localized_strings.get("buff.desc.heal_test")
},
BuffKind::Bleeding { .. } => {
localized_strings.get("debuff.desc.bleed_test")
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::Bleeding { .. } => localized_strings.get("debuff.desc.bleed"),
_ => localized_strings.get("buff.desc.missing"),
};
let desc = if buff.is_buff {

View File

@ -482,8 +482,10 @@ impl<'a> Widget for Group<'a> {
}) as u32; // Percentage to determine which frame of the timer overlay is displayed
let buff_img = match buff.kind {
BuffKind::Regeneration { .. } => self.imgs.buff_plus_0,
BuffKind::Saturation { .. } => self.imgs.buff_saturation_0,
BuffKind::Bleeding { .. } => self.imgs.debuff_bleed_0,
BuffKind::Cursed { .. } => self.imgs.debuff_skull_0,
BuffKind::Potion { .. } => self.imgs.buff_potion_0,
};
let buff_widget = Image::new(buff_img).w_h(15.0, 15.0);
let buff_widget = if let Some(id) = prev_id {
@ -510,10 +512,13 @@ impl<'a> Widget for Group<'a> {
// Create Buff tooltip
let title = match buff.kind {
BuffKind::Regeneration { .. } => {
localized_strings.get("buff.title.heal_test")
localized_strings.get("buff.title.heal")
},
BuffKind::Saturation { .. } => {
localized_strings.get("buff.title.saturation")
},
BuffKind::Bleeding { .. } => {
localized_strings.get("debuff.title.bleed_test")
localized_strings.get("debuff.title.bleed")
},
_ => localized_strings.get("buff.title.missing"),
};
@ -527,10 +532,13 @@ impl<'a> Widget for Group<'a> {
};
let desc_txt = match buff.kind {
BuffKind::Regeneration { .. } => {
localized_strings.get("buff.desc.heal_test")
localized_strings.get("buff.desc.heal")
},
BuffKind::Saturation { .. } => {
localized_strings.get("buff.desc.saturation")
},
BuffKind::Bleeding { .. } => {
localized_strings.get("debuff.desc.bleed_test")
localized_strings.get("debuff.desc.bleed")
},
_ => localized_strings.get("buff.desc.missing"),
};

View File

@ -352,6 +352,8 @@ image_ids! {
// Buffs
buff_plus_0: "voxygen.element.icons.de_buffs.buff_plus_0",
buff_saturation_0: "voxygen.element.icons.de_buffs.buff_saturation_0",
buff_potion_0: "voxygen.element.icons.de_buffs.buff_potion_0",
// Debuffs
debuff_skull_0: "voxygen.element.icons.de_buffs.debuff_skull_0",

View File

@ -243,8 +243,10 @@ impl<'a> Widget for Overhead<'a> {
}) as u32; // Percentage to determine which frame of the timer overlay is displayed
let buff_img = match buff.kind {
BuffKind::Regeneration { .. } => self.imgs.buff_plus_0,
BuffKind::Saturation { .. } => self.imgs.buff_saturation_0,
BuffKind::Bleeding { .. } => self.imgs.debuff_bleed_0,
BuffKind::Cursed { .. } => self.imgs.debuff_skull_0,
BuffKind::Potion { .. } => self.imgs.buff_potion_0,
};
let buff_widget = Image::new(buff_img).w_h(20.0, 20.0);
// Sort buffs into rows of 5 slots

View File

@ -537,7 +537,7 @@ impl Archetype for House {
center_offset.x,
center_offset.y,
z + 100,
)) % 11
)) % 12
{
0 => SpriteKind::Planter,
1 => SpriteKind::ChairSingle,
@ -554,6 +554,13 @@ impl Archetype for House {
7 => SpriteKind::DrawerSmall,
8 => SpriteKind::TableSide,
9 => SpriteKind::WardrobeSingle,
10 => {
if dynamic_rng.gen_range(0, 10) == 0 {
SpriteKind::PotionMinor
} else {
SpriteKind::VialEmpty
}
},
_ => SpriteKind::Pot,
};