From de5c5702b3db1c6610088b092de7263814ae63a4 Mon Sep 17 00:00:00 2001 From: Monty Marz Date: Sun, 10 Jan 2021 02:05:13 +0100 Subject: [PATCH] stats display Addressed comments. Addressed comments. --- .../voxygen/element/icons/combat_rating.png | 3 + assets/voxygen/element/icons/health.png | 3 + assets/voxygen/element/icons/protection.png | 4 +- assets/voxygen/element/icons/stamina.png | 3 + assets/voxygen/i18n/en.ron | 664 --------------- .../voxygen/voxel/sprite/lianas/liana-0.vox | 4 +- .../voxygen/voxel/sprite/lianas/liana-1.vox | 4 +- assets/voxygen/voxel/sprite_manifest.ron | 4 +- client/src/lib.rs | 473 +---------- common/src/combat.rs | 18 +- common/src/comp/ability.rs | 79 +- common/src/comp/skills.rs | 12 +- common/src/skillset_builder.rs | 774 +++++++++--------- voxygen/src/hud/bag.rs | 144 +++- voxygen/src/hud/img_ids.rs | 6 +- voxygen/src/hud/mod.rs | 74 +- voxygen/src/hud/overhead.rs | 4 +- 17 files changed, 624 insertions(+), 1649 deletions(-) create mode 100644 assets/voxygen/element/icons/combat_rating.png create mode 100644 assets/voxygen/element/icons/health.png create mode 100644 assets/voxygen/element/icons/stamina.png delete mode 100644 assets/voxygen/i18n/en.ron diff --git a/assets/voxygen/element/icons/combat_rating.png b/assets/voxygen/element/icons/combat_rating.png new file mode 100644 index 0000000000..7d1d5557dd --- /dev/null +++ b/assets/voxygen/element/icons/combat_rating.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d660727145908f18507c3300cd2eba3edb110c92ec7c31db623bc15a6735d693 +size 1778 diff --git a/assets/voxygen/element/icons/health.png b/assets/voxygen/element/icons/health.png new file mode 100644 index 0000000000..4b27749ae6 --- /dev/null +++ b/assets/voxygen/element/icons/health.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f440d78a6a3870c176e393dee767e9155e72b2c2c83d19089a50b0b4cb35d3e +size 1623 diff --git a/assets/voxygen/element/icons/protection.png b/assets/voxygen/element/icons/protection.png index 06e02352b5..d3fe808b4a 100644 --- a/assets/voxygen/element/icons/protection.png +++ b/assets/voxygen/element/icons/protection.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6412a1b82a084f9a7828f185752c891d40c5ce8c7575f91edfc360af47cf710f -size 404 +oid sha256:8f8686d0d63664551503752dd78097e9e8a96611f1ffedf5bb08c8d7a3c68ea5 +size 1624 diff --git a/assets/voxygen/element/icons/stamina.png b/assets/voxygen/element/icons/stamina.png new file mode 100644 index 0000000000..2606ecd59f --- /dev/null +++ b/assets/voxygen/element/icons/stamina.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc94604c7af34830f83f0f7df47b38a0dee38ad048856c45e5dfd03617c62f8e +size 1782 diff --git a/assets/voxygen/i18n/en.ron b/assets/voxygen/i18n/en.ron deleted file mode 100644 index 7066b63efe..0000000000 --- a/assets/voxygen/i18n/en.ron +++ /dev/null @@ -1,664 +0,0 @@ -/// 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 -/// of the next section -/// - 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 -/// `assets/voxygen/i18n` and that's it! -/// -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - metadata: ( - language_name: "English", - language_identifier: "en", - ), - convert_utf8_to_ascii: false, - 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, - ), - }, - string_map: { - /// Start Common section - // 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.languages": "Languages", - "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", - // 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", - - // 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.undead": "Undead", - "common.species.danari": "Danari", - - "common.weapons.axe": "Axe", - "common.weapons.sword": "Sword", - "common.weapons.staff": "Staff", - "common.weapons.bow": "Bow", - "common.weapons.hammer": "Hammer", - "common.weapons.sceptre": "Healing Sceptre", - "common.rand_appearance": "Random appearance and name", - /// End Common section - - - /// Start Main screen section - "main.username": "Username", - "main.server": "Server", - "main.password": "Password", - "main.connecting": "Connecting", - "main.creating_world": "Creating world", - "main.tip": "Tip:", - - // 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 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": "Server not found", - "main.login.authentication_error": "Auth error on server", - "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.already_logged_in": "You are already logged into the server.", - "main.login.network_error": "Network error", - "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.servers.select_server": "Select a server", - - /// End Main screen section - - - /// Start HUD Section - "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.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", - - // 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.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.pvp_buff_kill_msg": "[{attacker}] killed [{victim}]", - - - "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.", - - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOCKED", - - // Respawn message - "hud.press_key_to_respawn": r#"Press {key} to respawn at the last campfire you visited."#, - - // Welcome message - "hud.welcome": r#"Welcome to the Veloren Alpha! - - -Some tips before you start: - - -Press F1 to see the available key commands. - -Type /help into the chat to see chat commands - - -There are chests and other objects randomly spawning in the World! - -Right-Click to collect them. - -To actually use whatever you loot from those chests open your inventory with 'B'. - -Double click the items in your bag to use or equip them. - -Throw them away by clicking them once and clicking outside of the bag - - -Nights can get pretty dark in Veloren. - -Light your lantern by pressing 'G' - - -Want to free your cursor to close this window? Press TAB! - - -Enjoy your stay in the World of 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?"#, - - - - // 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", - - // Map and Questlog - "hud.map.map_title": "Map", - "hud.map.qlog_title": "Quests", - - // 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.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.transparency": "Transparency", - "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.single_damage_number": "Single Damage Numbers", - "hud.settings.cumulated_damage": "Cumulated Damage", - "hud.settings.incoming_damage": "Incoming Damage", - "hud.settings.cumulated_incoming_damage": "Cumulated Incoming Damage", - "hud.settings.speech_bubble": "Speech Bubble", - "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.values": "Values", - "hud.settings.percentages": "Percentages", - "hud.settings.chat": "Chat", - "hud.settings.background_transparency": "Background Transparency", - "hud.settings.chat_character_name": "Character Names in chat", - "hud.settings.loading_tips": "Loading Screen Tips", - - "hud.settings.pan_sensitivity": "Pan Sensitivity", - "hud.settings.zoom_sensitivity": "Zoom Sensitivity", - "hud.settings.invert_scroll_zoom": "Invert Scroll Zoom", - "hud.settings.invert_mouse_y_axis": "Invert Mouse 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.stop_auto_walk_on_input": "Stop auto walk on movement", - - "hud.settings.view_distance": "View 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.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": "Upscale Factor", - "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.particles": "Particles", - "hud.settings.resolution": "Resolution", - "hud.settings.bit_depth": "Bit Depth", - "hud.settings.refresh_rate": "Refresh Rate", - "hud.settings.save_window_size": "Save window size", - "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.lod_detail": "LoD Detail", - "hud.settings.save_window_size": "Save window size", - - - "hud.settings.music_volume": "Music Volume", - "hud.settings.sound_effect_volume": "Sound Effects Volume", - "hud.settings.audio_device": "Audio Device", - - "hud.settings.awaitingkey": "Press a key...", - "hud.settings.unbound": "None", - "hud.settings.reset_keybinds": "Reset to Defaults", - - "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", - - - "hud.crafting": "Crafting", - "hud.crafting.recipes": "Recipes", - "hud.crafting.ingredients": "Ingredients:", - "hud.crafting.craft": "Craft", - "hud.crafting.tool_cata": "Requires:", - - "hud.group": "Group", - "hud.group.invite_to_join": "{name} invited you to their group!", - "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", - - "hud.spell": "Spells", - - "hud.free_look_indicator": "Free look active. Press {key} to disable.", - "hud.auto_walk_indicator": "Auto walk active", - - "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.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.recenter": "Recenter", - - /// End HUD section - - - /// Start GameInput section - - "gameinput.primary": "Basic Attack", - "gameinput.secondary": "Secondary Attack/Block/Aim", - "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.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.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", - "gameinput.dance": "Dance", - "gameinput.select": "Select Entity", - "gameinput.acceptgroupinvite": "Accept Group Invite", - "gameinput.declinegroupinvite": "Decline Group Invite", - "gameinput.crafting": "Crafting", - "gameinput.fly": "Fly", - "gameinput.sneak": "Sneak", - "gameinput.swimdown": "Swim downwards", - "gameinput.swimup": "Swim upwards", - - /// End GameInput section - - - /// Start chracter selection section - "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!", - - /// End character selection section - - - /// Start character window section - "character_window.character_name": "Character Name", - // Character stats - "character_window.character_stats": r#"Endurance - -Fitness - -Willpower - -Protection -"#, - /// End character window section - - - /// Start Escape Menu Section - "esc_menu.logout": "Logout", - "esc_menu.quit_game": "Quit Game", - /// End Escape Menu Section - - /// Buffs and Debuffs - "buff.remove": "Click to remove", - "buff.title.missing": "Missing Title", - "buff.desc.missing": "Missing Description", - // Buffs - "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 1% per second.", - // Debuffs - "debuff.title.bleed": "Bleeding", - "debuff.desc.bleed": "Inflicts regular damage.", - }, - - - vector_map: { - "loading.tips": [ - "Press 'G' to light your lantern.", - "Press 'F1' 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.", - "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.", - "NPCs with the same level can have a different difficulty.", - "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's there to do? Try out one of the dungeons marked on the map!", - "Don't forget to adjust the graphics for your system. Press 'N' to open the settings.", - "Playing with others is fun! Press 'O' to see who is online.", - "An NPC with a skull beneath their healthbar is quite powerful compared to yourself.", - "Press 'J' to dance. Party!", - "Press 'L-Shift' 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.", - "In order to see your stats click the 'Stats' button in the inventory.", - ], - "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 tarrasque on you!", - ], - } -) diff --git a/assets/voxygen/voxel/sprite/lianas/liana-0.vox b/assets/voxygen/voxel/sprite/lianas/liana-0.vox index dbd9c9c832..4da8dc4a9d 100644 --- a/assets/voxygen/voxel/sprite/lianas/liana-0.vox +++ b/assets/voxygen/voxel/sprite/lianas/liana-0.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:70b967bda0f650f6f9ed021e984bf84a8d5077a51444229c1860583de5b2853e -size 2308 +oid sha256:23fdb055e6504172e63c028c4c0ebce9c2effdacb6c91e504e9d40b185df4b7d +size 58109 diff --git a/assets/voxygen/voxel/sprite/lianas/liana-1.vox b/assets/voxygen/voxel/sprite/lianas/liana-1.vox index 2a9cadfc36..205f6c3be7 100644 --- a/assets/voxygen/voxel/sprite/lianas/liana-1.vox +++ b/assets/voxygen/voxel/sprite/lianas/liana-1.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f02677ee40faa6ab0b9c1e57cb5e2d8170e1f47b96c24e7a31767f53d61e970 -size 1804 +oid sha256:d4d5f0bb4cacedea19415315f650ef59ec420808b820bc577746c3f15ed73fa0 +size 57081 diff --git a/assets/voxygen/voxel/sprite_manifest.ron b/assets/voxygen/voxel/sprite_manifest.ron index f1ce3fa57a..0915456ff9 100644 --- a/assets/voxygen/voxel/sprite_manifest.ron +++ b/assets/voxygen/voxel/sprite_manifest.ron @@ -565,12 +565,12 @@ Liana: Some(( variations: [ ( model: "voxygen.voxel.sprite.lianas.liana-0", - offset: (-1.5, -0.5, -88.0), + offset: (-4.0, -4.0, -88.0), lod_axes: (0.0, 0.0, 0.5), ), ( model: "voxygen.voxel.sprite.lianas.liana-1", - offset: (-1.0, -0.5, -55.0), + offset: (-4.0, -4.0, -55.0), lod_axes: (0.0, 0.0, 0.5), ), ], diff --git a/client/src/lib.rs b/client/src/lib.rs index 0b4e40008f..a232d620d0 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -942,478 +942,7 @@ impl Client { /// 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)), */ - Ok(()) => { - if message.starts_with('@') { - use comp::{item::tool::ToolKind::*, skills::*}; - match message.as_str() { - "@stats" => { - let stats = self - .state - .ecs() - .read_storage::() - .get(self.entity) - .cloned() - .unwrap(); - - tracing::info!("{:?}", stats.skill_set); - }, - "@unlock sword" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Sword), - ))); - }, - "@unlock sword interrupt" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::InterruptingAttacks, - ))); - }, - "@unlock sword combo" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsCombo, - ))); - }, - "@unlock sword combo damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsDamage, - ))); - }, - "@unlock sword combo regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsRegen, - ))); - }, - "@unlock sword combo speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsSpeed, - ))); - }, - "@unlock sword dash cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DCost, - ))); - }, - "@unlock sword dash drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DDrain, - ))); - }, - "@unlock sword dash damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DDamage, - ))); - }, - "@unlock sword dash scaling" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DScaling, - ))); - }, - "@unlock sword dash speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DSpeed, - ))); - }, - "@unlock sword dash infinite" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DInfinite, - ))); - }, - "@unlock sword spin unlock" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SUnlockSpin, - ))); - }, - "@unlock sword spin damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SDamage, - ))); - }, - "@unlock sword spin speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SSpeed, - ))); - }, - "@unlock sword spin cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SCost, - ))); - }, - "@unlock sword spin num" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SSpins, - ))); - }, - "@unlock axe" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Axe), - ))); - }, - "@unlock axe combo" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsCombo, - ))); - }, - "@unlock axe combo damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsDamage, - ))); - }, - "@unlock axe combo speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsCombo, - ))); - }, - "@unlock axe combo regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsRegen, - ))); - }, - "@unlock axe spin infinite" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::SInfinite, - ))); - }, - "@unlock axe spin helicopter" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::SHelicopter, - ))); - }, - "@unlock axe spin damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::SDamage, - ))); - }, - "@unlock axe spin speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe(AxeSkill::SSpeed))); - }, - "@unlock axe spin cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe(AxeSkill::SCost))); - }, - "@unlock axe leap unlock" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LUnlockLeap, - ))); - }, - "@unlock axe leap damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LDamage, - ))); - }, - "@unlock axe leap knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LKnockback, - ))); - }, - "@unlock axe leap cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe(AxeSkill::LCost))); - }, - "@unlock axe leap distance" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LDistance, - ))); - }, - "@unlock hammer" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Hammer), - ))); - }, - "@unlock hammer combo" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsKnockback, - ))); - }, - "@unlock hammer combo damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsDamage, - ))); - }, - "@unlock hammer combo speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsSpeed, - ))); - }, - "@unlock hammer combo regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsRegen, - ))); - }, - "@unlock hammer charge knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CKnockback, - ))); - }, - "@unlock hammer charge damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CDamage, - ))); - }, - "@unlock hammer charge drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CDrain, - ))); - }, - "@unlock hammer charge speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CSpeed, - ))); - }, - "@unlock hammer leap unlock" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LUnlockLeap, - ))); - }, - "@unlock hammer leap damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LDamage, - ))); - }, - "@unlock hammer leap cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LCost, - ))); - }, - "@unlock hammer leap distance" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LDistance, - ))); - }, - "@unlock hammer leap knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LKnockback, - ))); - }, - "@unlock hammer leap range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LRange, - ))); - }, - "@unlock bow" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Bow), - ))); - }, - "@unlock bow proj speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::ProjSpeed, - ))); - }, - "@unlock bow basic damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::BDamage, - ))); - }, - "@unlock bow basic regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::BRegen))); - }, - "@unlock bow charged damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::CDamage, - ))); - }, - "@unlock bow charged knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::CKnockback, - ))); - }, - "@unlock bow charged proj speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::CProjSpeed, - ))); - }, - "@unlock bow charged drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::CDrain))); - }, - "@unlock bow charged speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::CSpeed))); - }, - "@unlock bow charged move" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::CMove))); - }, - "@unlock bow repeater" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::UnlockRepeater, - ))); - }, - "@unlock bow repeater damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::RDamage, - ))); - }, - "@unlock bow repeater glide" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::RGlide))); - }, - "@unlock bow repeater arrows" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::RArrows, - ))); - }, - "@unlock bow repeater cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::RCost))); - }, - "@unlock staff" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Staff), - ))); - }, - "@unlock staff fireball" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BExplosion, - ))); - }, - "@unlock staff fireball damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BDamage, - ))); - }, - "@unlock staff fireball regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BRegen, - ))); - }, - "@unlock staff fireball radius" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BRadius, - ))); - }, - "@unlock staff beam damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FDamage, - ))); - }, - "@unlock staff beam range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FRange, - ))); - }, - "@unlock staff beam drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FDrain, - ))); - }, - "@unlock staff beam velocity" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FVelocity, - ))); - }, - "@unlock staff shockwave" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::UnlockShockwave, - ))); - }, - "@unlock staff shockwave damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SDamage, - ))); - }, - "@unlock staff shockwave knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SKnockback, - ))); - }, - "@unlock staff shockwave range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SRange, - ))); - }, - "@unlock staff shockwave cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SCost, - ))); - }, - "@unlock sceptre" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Sceptre), - ))); - }, - "@unlock sceptre beam heal" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BHeal, - ))); - }, - "@unlock sceptre beam damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BDamage, - ))); - }, - "@unlock sceptre beam range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BRange, - ))); - }, - "@unlock sceptre beam lifesteal" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BLifesteal, - ))); - }, - "@unlock sceptre beam regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BRegen, - ))); - }, - "@unlock sceptre beam cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BCost, - ))); - }, - "@unlock sceptre proj heal" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PHeal, - ))); - }, - "@unlock sceptre proj damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PDamage, - ))); - }, - "@unlock sceptre proj radius" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PRadius, - ))); - }, - "@unlock sceptre proj cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PCost, - ))); - }, - "@unlock sceptre proj speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PProjSpeed, - ))); - }, - "@unlock health" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::General( - GeneralSkill::HealthIncrease, - ))); - }, - "@unlock energy" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::General( - GeneralSkill::EnergyIncrease, - ))); - }, - "@unlock roll melee" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll( - RollSkill::ImmuneMelee, - ))); - }, - "@unlock roll cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll(RollSkill::Cost))); - }, - "@unlock roll strength" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll( - RollSkill::Strength, - ))); - }, - "@unlock roll duration" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll( - RollSkill::Duration, - ))); - }, - _ => {}, - } - } else { - self.send_msg(ClientGeneral::ChatMsg(message)) - } - }, + Ok(()) => self.send_msg(ClientGeneral::ChatMsg(message)), Err(ChatMsgValidationError::TooLong) => tracing::warn!( "Attempted to send a message that's too long (Over {} bytes)", MAX_BYTES_CHAT_MSG diff --git a/common/src/combat.rs b/common/src/combat.rs index 4b2e9edd6d..fa31aabea7 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -229,33 +229,31 @@ pub fn get_weapons(inv: &Inventory) -> (Option, Option) { ) } -pub fn get_weapon_damage(inv: &Inventory) -> f32 { - let active_power = inv.equipped(EquipSlot::Mainhand).map_or(0.0, |i| { +fn max_equipped_weapon_damage(inv: &Inventory) -> f32 { + let active_damage = inv.equipped(EquipSlot::Mainhand).map_or(0.0, |i| { if let ItemKind::Tool(tool) = &i.kind() { tool.base_power() * tool.base_speed() } else { 0.0 } }); - let second_power = inv.equipped(EquipSlot::Offhand).map_or(0.0, |i| { + let second_damage = inv.equipped(EquipSlot::Offhand).map_or(0.0, |i| { if let ItemKind::Tool(tool) = &i.kind() { tool.base_power() * tool.base_speed() } else { 0.0 } }); - active_power.max(second_power).max(0.1) + active_damage.max(second_damage) } pub fn combat_rating(inventory: &Inventory, health: &Health, body: &Body) -> f32 { let defensive_weighting = tweak!(1.0); let offensive_weighting = tweak!(1.0); - let defensive_rating = - health.maximum() as f32 / (1.0 - Damage::compute_damage_reduction(inventory)) / 100.0; - let offensive_rating = get_weapon_damage(inventory); - //let combined_rating = 2.0 / ((1.0 / offensive_rating) + (1.0 / - // defensive_rating)); let combined_rating = offensive_rating * - // defensive_rating / (offensive_rating + defensive_rating); + let defensive_rating = health.maximum() as f32 + / (1.0 - Damage::compute_damage_reduction(inventory)).max(0.00001) + / 100.0; + let offensive_rating = max_equipped_weapon_damage(inventory).max(0.1); let combined_rating = (offensive_rating * offensive_weighting + defensive_rating * defensive_weighting) / (2.0 * offensive_weighting.max(defensive_weighting)); diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index 98052806c9..5e80eea5ab 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -540,14 +540,11 @@ impl CharacterAbility { } else { 0 }; - { - *max_energy_gain = (*max_energy_gain as f32 - * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 - / ((Sword(TsRegen).get_max_level().unwrap() + 1) - * stage_data.len() as u16 - - 1) as f32) - as u32; - } + *max_energy_gain = (*max_energy_gain as f32 + * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 + / ((Sword(TsRegen).get_max_level().unwrap() + 1) + * stage_data.len() as u16 + - 1) as f32) as u32; *scales_from_combo = skills .get(&Sword(TsDamage)) .copied() @@ -641,14 +638,11 @@ impl CharacterAbility { } else { 0 }; - { - *max_energy_gain = (*max_energy_gain as f32 - * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 - / ((Axe(DsRegen).get_max_level().unwrap() + 1) - * stage_data.len() as u16 - - 1) as f32) - as u32; - } + *max_energy_gain = (*max_energy_gain as f32 + * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 + / ((Axe(DsRegen).get_max_level().unwrap() + 1) + * stage_data.len() as u16 + - 1) as f32) as u32; *scales_from_combo = skills .get(&Axe(DsDamage)) .copied() @@ -736,13 +730,11 @@ impl CharacterAbility { } else { 0 }; - { - *max_energy_gain = (*max_energy_gain as f32 - * ((energy_level + 1) * stage_data.len() as u16) as f32 - / ((Hammer(SsRegen).get_max_level().unwrap() + 1) - * stage_data.len() as u16) - as f32) as u32; - } + *max_energy_gain = (*max_energy_gain as f32 + * ((energy_level + 1) * stage_data.len() as u16) as f32 + / ((Hammer(SsRegen).get_max_level().unwrap() + 1) + * stage_data.len() as u16) as f32) + as u32; *scales_from_combo = skills .get(&Hammer(SsDamage)) .copied() @@ -814,16 +806,12 @@ impl CharacterAbility { if let Some(level) = skills.get(&Bow(ProjSpeed)).copied().flatten() { *projectile_speed *= 1.5_f32.powi(level.into()); } - { - let damage_level = - skills.get(&Bow(BDamage)).copied().flatten().unwrap_or(0); - let regen_level = - skills.get(&Bow(BRegen)).copied().flatten().unwrap_or(0); - let power = 1.3_f32.powi(damage_level.into()); - let regen = 1.5_f32.powi(regen_level.into()); - *projectile = - projectile.modified_projectile(power, regen, 1_f32, 1_f32); - } + let damage_level = + skills.get(&Bow(BDamage)).copied().flatten().unwrap_or(0); + let regen_level = skills.get(&Bow(BRegen)).copied().flatten().unwrap_or(0); + let power = 1.3_f32.powi(damage_level.into()); + let regen = 1.5_f32.powi(regen_level.into()); + *projectile = projectile.modified_projectile(power, regen, 1_f32, 1_f32); }, ChargedRanged { ref mut scaled_damage, @@ -898,19 +886,16 @@ impl CharacterAbility { if !skills.contains_key(&Staff(BExplosion)) { *projectile = projectile.fireball_to_firebolt(); } - { - let damage_level = - skills.get(&Staff(BDamage)).copied().flatten().unwrap_or(0); - let regen_level = - skills.get(&Staff(BRegen)).copied().flatten().unwrap_or(0); - let range_level = - skills.get(&Staff(BRadius)).copied().flatten().unwrap_or(0); - let power = 1.2_f32.powi(damage_level.into()); - let regen = 1.2_f32.powi(regen_level.into()); - let range = 1.1_f32.powi(range_level.into()); - *projectile = - projectile.modified_projectile(power, regen, range, 1_f32); - } + let damage_level = + skills.get(&Staff(BDamage)).copied().flatten().unwrap_or(0); + let regen_level = + skills.get(&Staff(BRegen)).copied().flatten().unwrap_or(0); + let range_level = + skills.get(&Staff(BRadius)).copied().flatten().unwrap_or(0); + let power = 1.2_f32.powi(damage_level.into()); + let regen = 1.2_f32.powi(regen_level.into()); + let range = 1.1_f32.powi(range_level.into()); + *projectile = projectile.modified_projectile(power, regen, range, 1_f32); }, BasicBeam { ref mut base_dps, @@ -1058,7 +1043,7 @@ impl CharacterAbility { } } }, - _ => {}, + Some(_) => {}, } self } diff --git a/common/src/comp/skills.rs b/common/src/comp/skills.rs index 79b67dbcd7..83bf045f0d 100644 --- a/common/src/comp/skills.rs +++ b/common/src/comp/skills.rs @@ -222,8 +222,18 @@ pub enum SkillGroupType { impl SkillGroupType { /// Gets the cost in experience of earning a skill point + #[allow(clippy::many_single_char_names)] pub fn skill_point_cost(self, level: u16) -> u16 { - 10 * (35.0 * (0.08 * level as f32 - 1.5).atan() + 50.0).floor() as u16 + let exp_increment = 10.0; + let starting_exp = 150.0; + let exp_ceiling = 1000.0; + let scaling_factor = 0.1; + let a = exp_increment; + let b = (exp_ceiling - starting_exp) / ((1.0 + std::f32::consts::PI / 2.0) * exp_increment); + let c = scaling_factor; + let d = (-1.0_f32).tan(); + let e = starting_exp / exp_increment + b; + (a * (b * (c * level as f32 + d).atan() + e).floor()) as u16 } /// Gets the total amount of skill points that can be spent in a particular diff --git a/common/src/skillset_builder.rs b/common/src/skillset_builder.rs index 5db4bbe7c2..c47e87d067 100644 --- a/common/src/skillset_builder.rs +++ b/common/src/skillset_builder.rs @@ -41,64 +41,67 @@ impl SkillSetBuilder { Some(Guard) => { if let Some(ToolKind::Sword) = active_item { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::DSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DInfinite)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DInfinite)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); } }, Some(Outcast) => { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); }, _ => {}, } @@ -107,57 +110,60 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CMove)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CMove)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); }, _ => {}, } @@ -166,65 +172,68 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::BRegen)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BRegen)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); }, _ => {}, } @@ -233,71 +242,74 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); }, _ => {}, } @@ -306,71 +318,74 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); }, _ => {}, } @@ -379,81 +394,84 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::BRegen)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CMove)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BRegen)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CMove)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); - skillset.with_skill(Skill::Staff(StaffSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SCost)); }, _ => {}, } @@ -462,104 +480,107 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::BRegen)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CMove)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BRegen)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CMove)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); - skillset.with_skill(Skill::Staff(StaffSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SCost)); }, _ => {}, } }, - _ => {}, + Some(Villager) | None => {}, } skillset } - pub fn with_skill(&mut self, skill: Skill) { + pub fn with_skill(mut self, skill: Skill) -> Self { if let Some(skill_group) = skill.get_skill_group_type() { self.0 .add_skill_points(skill_group, self.0.skill_point_cost(skill)); @@ -571,11 +592,18 @@ impl SkillSetBuilder { skill ); } + } else { + warn!( + "Tried to add skill: {:?} which does not have an associated skill group.", + skill + ); } + self } - pub fn with_skill_group(&mut self, skill_group: SkillGroupType) { + pub fn with_skill_group(mut self, skill_group: SkillGroupType) -> Self { self.0.unlock_skill_group(skill_group); + self } pub fn build(self) -> SkillSet { self.0 } diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index 311017dfd5..6ad564e6b0 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -3,7 +3,9 @@ use super::{ item_imgs::ItemImgs, slots::{ArmorSlot, EquipSlot, InventorySlot, SlotManager}, util::loadout_slot_text, - Show, CRITICAL_HP_COLOR, LOW_HP_COLOR, QUALITY_COMMON, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN, + Show, CRITICAL_HP_COLOR, LOW_HP_COLOR, QUALITY_ARTIFACT, QUALITY_COMMON, QUALITY_DEBUG, + QUALITY_EPIC, QUALITY_HIGH, QUALITY_LEGENDARY, QUALITY_LOW, QUALITY_MODERATE, TEXT_COLOR, + UI_HIGHLIGHT_0, UI_MAIN, XP_COLOR, }; use crate::{ hud::get_quality_col, @@ -16,16 +18,17 @@ use crate::{ }; use client::Client; use common::{ - combat::Damage, - comp::{item::Quality, Stats}, + combat::{combat_rating, Damage}, + comp::{item::Quality, Energy, Health, Stats}, }; use conrod_core::{ color, widget::{self, Button, Image, Rectangle, Scrollbar, Text}, - widget_ids, Color, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon, + widget_ids, Color, Colorable, Positionable, Sizeable, Widget, WidgetCommon, }; use crate::hud::slots::SlotKind; +use inline_tweak::*; use vek::Vec2; widget_ids! { @@ -49,22 +52,11 @@ widget_ids! { inventory_title_bg, scrollbar_bg, scrollbar_slots, - stats_button, tab_1, tab_2, tab_3, tab_4, bag_expand_btn, - // Stats - stats_alignment, - level, - exp_rectangle, - exp_progress_rectangle, - expbar, - exp, - divider, - statnames, - stats, // Armor Slots slots_bg, head_slot, @@ -87,11 +79,9 @@ widget_ids! { bag2_slot, bag3_slot, bag4_slot, - // ??? - end_ico, - fit_ico, - wp_ico, - prot_ico, + // Stats + stat_icons[], + stat_txts[], } } @@ -108,8 +98,9 @@ pub struct Bag<'a> { slot_manager: &'a mut SlotManager, _pulse: f32, localized_strings: &'a Localization, - stats: &'a Stats, + health: &'a Health, + energy: &'a Energy, show: &'a Show, } @@ -126,6 +117,8 @@ impl<'a> Bag<'a> { pulse: f32, localized_strings: &'a Localization, stats: &'a Stats, + health: &'a Health, + energy: &'a Energy, show: &'a Show, ) -> Self { Self { @@ -140,10 +133,13 @@ impl<'a> Bag<'a> { _pulse: pulse, localized_strings, stats, + energy, + health, show, } } } +const STATS: [&str; 4] = ["Health", "Stamina", "Protection", "Combat Rating"]; pub struct State { ids: Ids, @@ -422,25 +418,103 @@ impl<'a> Widget for Bag<'a> { let i18n = &self.localized_strings; let filled_slot = self.imgs.armor_slot; if !self.show.bag_inv { - let damage_reduction = (100.0 * Damage::compute_damage_reduction(inventory)) as i32; - Button::image(self.imgs.protection_ico) + // Stat icons and text + state.update(|s| { + s.ids + .stat_icons + .resize(STATS.len(), &mut ui.widget_id_generator()) + }); + state.update(|s| { + s.ids + .stat_txts + .resize(STATS.len(), &mut ui.widget_id_generator()) + }); + // Thresholds (lower) + let common = tweak!(4.3); + let moderate = tweak!(6.0); + let high = tweak!(8.0); + let epic = tweak!(10.0); + let legendary = tweak!(79.0); + let artifact = tweak!(122.0); + let debug = tweak!(200.0); + // Stats + let combat_rating = + combat_rating(inventory, self.health, &self.stats.body_type).min(999.9); + let indicator_col = match combat_rating { + x if (0.0..common).contains(&x) => QUALITY_LOW, + x if (common..moderate).contains(&x) => QUALITY_COMMON, + x if (moderate..high).contains(&x) => QUALITY_MODERATE, + x if (high..epic).contains(&x) => QUALITY_HIGH, + x if (epic..legendary).contains(&x) => QUALITY_EPIC, + x if (legendary..artifact).contains(&x) => QUALITY_LEGENDARY, + x if (artifact..debug).contains(&x) => QUALITY_ARTIFACT, + x if x >= debug => QUALITY_DEBUG, + _ => XP_COLOR, + }; + for i in STATS.iter().copied().enumerate() { + let btn = Button::image(match i.1 { + "Health" => self.imgs.health_ico, + "Stamina" => self.imgs.stamina_ico, + "Combat Rating" => self.imgs.combat_rating_ico, + "Protection" => self.imgs.protection_ico, + _ => self.imgs.nothing, + }) .w_h(20.0, 20.0) - .top_left_with_margins_on(state.ids.bg_frame, 51.0, 5.0) - .color(UI_HIGHLIGHT_0) - .label(&format!("{}%", damage_reduction)) - .label_y(conrod_core::position::Relative::Scalar(2.0)) - .label_x(conrod_core::position::Relative::Scalar(25.0)) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(12)) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( + .image_color(if i.1 == "Combat Rating" { + indicator_col + } else { + TEXT_COLOR + }); + let protection_txt = format!( + "{}%", + (100.0 * Damage::compute_damage_reduction(inventory)) as i32 + ); + let health_txt = format!("{}", (self.health.maximum() as f32 / 10.0) as usize); + let stamina_txt = format!("{}", (self.energy.maximum() as f32 / 10.0) as usize); + let combat_rating_txt = format!("{}", (combat_rating * 10.0) as usize); + + let btn = if i.0 == 0 { + btn.top_left_with_margins_on(state.ids.bg_frame, tweak!(55.0), tweak!(10.0)) + } else { + btn.down_from(state.ids.stat_icons[i.0 - 1], tweak!(7.0)) + }; + // TODO: Translation + let tooltip_head = match i.1 { + "Health" => "Health", + "Stamina" => "Stamina", + "Combat Rating" => "Combat Rating", + "Protection" => "Protection", + _ => "", + }; + // TODO: Translation + let tooltip_txt = match i.1 { + "Combat Rating" => "Calculated from your\nequipment and health.", + "Protection" => "Damage reduction through armor", + _ => "", + }; + btn.with_tooltip( self.tooltip_manager, - "Protection", - "Damage reduction through armor", + &tooltip_head, + &tooltip_txt, &bag_tooltip, TEXT_COLOR, ) - .set(state.ids.prot_ico, ui); + .set(state.ids.stat_icons[i.0], ui); + Text::new(match i.1 { + "Health" => &health_txt, + "Stamina" => &stamina_txt, + "Combat Rating" => &combat_rating_txt, + "Protection" => &protection_txt, + _ => "", + }) + .right_from(state.ids.stat_icons[i.0], tweak!(10.0)) + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(tweak!(14))) + .color(TEXT_COLOR) + .graphics_for(state.ids.stat_icons[i.0]) + .set(state.ids.stat_txts[i.0], ui); + } + // Loadout Slots // Head let (title, desc) = loadout_slot_text( inventory.equipped(EquipSlot::Armor(ArmorSlot::Head)), diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 20d4b1effc..4f5e06cab9 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -334,10 +334,10 @@ image_ids! { mainhand_bg: "voxygen.element.icons.mainhand", bag_bg: "voxygen.element.icons.bag", offhand_bg: "voxygen.element.icons.offhand", - willpower_ico: "voxygen.element.icons.willpower", - endurance_ico: "voxygen.element.icons.endurance", - fitness_ico: "voxygen.element.icons.fitness", + stamina_ico: "voxygen.element.icons.stamina", + health_ico: "voxygen.element.icons.health", protection_ico: "voxygen.element.icons.protection", + combat_rating_ico: "voxygen.element.icons.combat_rating", not_found: "voxygen.element.not_found", diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 993604f49b..ff19ed84ed 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -1994,40 +1994,6 @@ impl Hud { } } - // Bag contents - if self.show.bag { - if let Some(player_stats) = stats.get(client.entity()) { - match Bag::new( - client, - &self.imgs, - &self.item_imgs, - &self.fonts, - &self.rot_imgs, - tooltip_manager, - &mut self.slot_manager, - self.pulse, - i18n, - &player_stats, - &self.show, - ) - .set(self.ids.bag, ui_widgets) - { - Some(bag::Event::BagExpand) => self.show.bag_inv = !self.show.bag_inv, - Some(bag::Event::Close) => { - self.show.stats = false; - self.show.bag(false); - self.show.crafting(false); - if !self.show.social { - self.show.want_grab = true; - self.force_ungrab = false; - } else { - self.force_ungrab = true - }; - }, - None => {}, - } - } - } // Skillbar // Get player stats let ecs = client.state().ecs(); @@ -2072,6 +2038,46 @@ impl Hud { ) .set(self.ids.skillbar, ui_widgets); } + // Bag contents + if self.show.bag { + if let (Some(player_stats), Some(health), Some(energy)) = ( + stats.get(client.entity()), + healths.get(entity), + energies.get(entity), + ) { + match Bag::new( + client, + &self.imgs, + &self.item_imgs, + &self.fonts, + &self.rot_imgs, + tooltip_manager, + &mut self.slot_manager, + self.pulse, + i18n, + &player_stats, + &health, + &energy, + &self.show, + ) + .set(self.ids.bag, ui_widgets) + { + Some(bag::Event::BagExpand) => self.show.bag_inv = !self.show.bag_inv, + Some(bag::Event::Close) => { + self.show.stats = false; + self.show.bag(false); + self.show.crafting(false); + if !self.show.social { + self.show.want_grab = true; + self.force_ungrab = false; + } else { + self.force_ungrab = true + }; + }, + None => {}, + } + } + } // Buffs let ecs = client.state().ecs(); let entity = client.entity(); diff --git a/voxygen/src/hud/overhead.rs b/voxygen/src/hud/overhead.rs index 4a30687a21..54c69600e7 100644 --- a/voxygen/src/hud/overhead.rs +++ b/voxygen/src/hud/overhead.rs @@ -380,8 +380,8 @@ impl<'a> Widget for Overhead<'a> { // Thresholds (lower) let common = tweak!(4.3); let moderate = tweak!(6.0); - let high = tweak!(10.8); - let epic = tweak!(14.1); + let high = tweak!(8.0); + let epic = tweak!(10.0); let legendary = tweak!(79.0); let artifact = tweak!(122.0); let debug = tweak!(200.0);