From ea87a446eb8588e42bfea728f8329203795a6535 Mon Sep 17 00:00:00 2001 From: MewMew Date: Wed, 2 Oct 2019 06:37:21 +0200 Subject: [PATCH] module wip --- modules/rpg.lua | 154 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 132 insertions(+), 22 deletions(-) diff --git a/modules/rpg.lua b/modules/rpg.lua index f783060b..d6a83ad9 100644 --- a/modules/rpg.lua +++ b/modules/rpg.lua @@ -1,40 +1,76 @@ --[[ +Character Experience Gain RPG module by MewMew + STRENGTH > character_inventory_slots_bonus , character_mining_speed_modifier MAGIC > character_build_distance_bonus, character_item_drop_distance_bonus, character_reach_distance_bonus, - character_resource_reach_distance_bonus, character_item_pickup_distance_bonus, character_loot_pickup_distance_bonus, + character_item_pickup_distance_bonus, character_loot_pickup_distance_bonus, DEXTERITY > character_running_speed_modifier, character_crafting_speed_modifier VITALITY > character_health_bonus + damage resistance - -?? > Melee damage ]] local visuals_delay = 60 local experience_levels = {0} for a = 1, 9999, 1 do - experience_levels[#experience_levels + 1] = experience_levels[#experience_levels] + a * 2 + experience_levels[#experience_levels + 1] = experience_levels[#experience_levels] + a * 8 end local classes = { ["engineer"] = "ENGINEER", - ["strength"] = "WARRIOR", - ["magic"] = "SORCEROR", + ["strength"] = "MINER", + ["magic"] = "WIZZARD", ["dexterity"] = "ROGUE", ["vitality"] = "TANK", } +local function create_gui_char_button(player) + if player.gui.top.rpg then return end + local b = player.gui.top.add({type = "sprite-button", name = "rpg", caption = "CHAR"}) + b.style.font_color = {180,180,180} + b.style.font = "heading-1" + b.style.minimal_height = 38 + b.style.minimal_width = 60 + b.style.top_padding = 2 + b.style.left_padding = 4 + b.style.right_padding = 4 + b.style.bottom_padding = 2 +end + +local function update_player_stats(player) + local strength = global.rpg[player.index].strength - 10 + player.character_inventory_slots_bonus = strength * 0.2 + player.character_mining_speed_modifier = strength * 0.01 + + local magic = global.rpg[player.index].magic - 10 + local v = magic * 0.2 + player.character_build_distance_bonus = v + player.character_item_drop_distance_bonus = v + player.character_reach_distance_bonus = v + --player.character_resource_reach_distance_bonus = v + player.character_item_pickup_distance_bonus = v + player.character_loot_pickup_distance_bonus = v + + local dexterity = global.rpg[player.index].dexterity - 10 + player.character_running_speed_modifier = dexterity * 0.005 + player.character_crafting_speed_modifier = dexterity * 0.01 + + player.character_health_bonus = (global.rpg[player.index].vitality - 10) * 8 +end + local function get_class(player) - local high_attribute = global.rpg[player.index].strength - local high_attribute_name = "engineer" + local average = (global.rpg[player.index].strength + global.rpg[player.index].magic + global.rpg[player.index].dexterity + global.rpg[player.index].vitality) / 4 + local high_attribute = 0 + local high_attribute_name = "" for _, attribute in pairs({"strength", "magic", "dexterity", "vitality"}) do if global.rpg[player.index][attribute] > high_attribute then high_attribute = global.rpg[player.index][attribute] high_attribute_name = attribute end end + if high_attribute < average + average * 0.25 then high_attribute_name = "engineer" end return classes[high_attribute_name] end @@ -63,10 +99,15 @@ local function add_gui_stat(element, value, width) return e end -local function add_gui_increase_stat(element, player, width) +local function add_gui_increase_stat(element, name, player, width) local sprite = "virtual-signal/signal-red" - if global.rpg[player.index].points_to_distribute <= 0 then sprite = "virtual-signal/signal-black" end - local e = element.add({type = "sprite-button", caption = "✚", sprite = sprite}) + local symbol = "✚" + if global.rpg[player.index].points_to_distribute <= 0 then + --symbol = " " + sprite = "virtual-signal/signal-black" + end + + local e = element.add({type = "sprite-button", name = name, caption = symbol, sprite = sprite}) e.style.maximal_height = 40 e.style.minimal_height = 40 e.style.maximal_width = width @@ -130,22 +171,22 @@ local function draw_gui(player) local e = add_gui_description(tt, "STRENGTH", w1) e.tooltip = "Increases inventory slots and mining speed." add_gui_stat(tt, global.rpg[player.index].strength, w2) - add_gui_increase_stat(tt, player, w2) + add_gui_increase_stat(tt, "strength", player, w2) local e = add_gui_description(tt, "MAGIC", w1) e.tooltip = "Increases reach distance." add_gui_stat(tt, global.rpg[player.index].magic, w2) - add_gui_increase_stat(tt, player, w2) + add_gui_increase_stat(tt, "magic", player, w2) local e = add_gui_description(tt, "DEXTERITY", w1) e.tooltip = "Increases running and crafting speed." add_gui_stat(tt, global.rpg[player.index].dexterity, w2) - add_gui_increase_stat(tt, player, w2) + add_gui_increase_stat(tt, "dexterity", player, w2) local e = add_gui_description(tt, "VITALITY", w1) e.tooltip = "Increases health and damage resistance." add_gui_stat(tt, global.rpg[player.index].vitality, w2) - add_gui_increase_stat(tt, player, w2) + add_gui_increase_stat(tt, "vitality", player, w2) add_gui_description(tt, "POINTS TO\nDISTRIBUTE", w1) local e = add_gui_stat(tt, global.rpg[player.index].points_to_distribute, w2) @@ -187,7 +228,7 @@ local function draw_gui(player) add_gui_description(tt, " ", w0) add_gui_description(tt, "SLOT\nBONUS", w1) - local value = "+" .. player.force.character_inventory_slots_bonus + player.character_inventory_slots_bonus + local value = "+ " .. player.force.character_inventory_slots_bonus + player.character_inventory_slots_bonus add_gui_stat(tt, value, w2) add_gui_description(tt, " ", w0) @@ -196,7 +237,7 @@ local function draw_gui(player) add_gui_description(tt, " ", w0) add_gui_description(tt, "REACH\nDISTANCE", w1) - local value = (player.force.character_reach_distance_bonus + player.character_reach_distance_bonus + 1) * 100 .. "%" + local value = "+ " .. (player.force.character_reach_distance_bonus + player.character_reach_distance_bonus) add_gui_stat(tt, value, w2) add_gui_description(tt, " ", w0) @@ -219,7 +260,7 @@ local function draw_gui(player) add_gui_description(tt, " ", w0) add_gui_description(tt, "HEALTH\nBONUS", w1) - local value = (player.force.character_health_bonus + player.character_health_bonus + 1) * 100 .. "%" + local value = "+ " .. (player.force.character_health_bonus + player.character_health_bonus) add_gui_stat(tt, value, w2) add_gui_description(tt, " ", w0) @@ -275,20 +316,86 @@ local function gain_xp(player, amount) global.rpg[player.index].last_floaty_text = game.tick + visuals_delay end +local function on_gui_click(event) + if not event.element then return end + if not event.element.valid then return end + local element = event.element + + if element.type ~= "sprite-button" then return end + + if element.caption == "CHAR" then + if element.name == "rpg" then + local player = game.players[event.player_index] + if player.gui.left.rpg then + player.gui.left.rpg.destroy() + return + end + draw_gui(player) + end + end + + if element.caption ~= "✚" then return end + if element.sprite ~= "virtual-signal/signal-red" then return end + + local index = element.name + local player = game.players[event.player_index] + if not global.rpg[player.index][index] then return end + global.rpg[player.index].points_to_distribute = global.rpg[player.index].points_to_distribute - 1 + global.rpg[player.index][index] = global.rpg[player.index][index] + 1 + update_player_stats(player) + draw_gui(player) +end + +local xp_yield = { + ["small-biter"] = 1, + ["medium-biter"] = 2, + ["big-biter"] = 3, + ["behemoth-biter"] = 5, + ["small-spitter"] = 1, + ["medium-spitter"] = 2, + ["big-spitter"] = 3, + ["behemoth-spitter"] = 5, + ["spitter-spawner"] = 32, + ["biter-spawner"] = 32, + ["small-worm-turret"] = 8, + ["medium-worm-turret"] = 16, + ["big-worm-turret"] = 24 +} + +local function on_entity_died(event) + if not event.cause then return end + if not event.cause.valid then return end + if event.cause.name ~= "character" then return end + if not event.cause.player then return end + if not event.entity.valid then return end + if event.cause.force.name == event.entity.force.name then return end + local xp = 0.5 + if xp_yield[event.entity.name] then xp = xp_yield[event.entity.name] end + gain_xp(event.cause.player, xp) +end + local function on_player_changed_position(event) local player = game.players[event.player_index] if not player.character then return end - gain_xp(player, 0.1) - if player.character.driving == true then return end + if player.character.driving then return end + gain_xp(player, 0.01) +end + +local function on_player_mined_entity(event) + if not event.entity.valid then return end + local player = game.players[event.player_index] + if event.entity.force.name == "neutral" then gain_xp(player, 1.5 + event.entity.prototype.max_health * 0.005) return end + gain_xp(player, 0.1 + event.entity.prototype.max_health * 0.0005) end local function on_player_joined_game(event) local player = game.players[event.player_index] if not global.rpg[player.index] then - global.rpg[player.index] = {level = 0, xp = 0, strength = 15, magic = 15, dexterity = 15, vitality = 15, points_to_distribute = 0, last_floaty_text = 0, xp_since_last_floaty_text = 0} + global.rpg[player.index] = {level = 0, xp = 0, strength = 10, magic = 10, dexterity = 10, vitality = 10, points_to_distribute = -5, last_floaty_text = visuals_delay, xp_since_last_floaty_text = 0} end + create_gui_char_button(player) level_up(player) - + update_player_stats(player) draw_gui(player) end @@ -298,5 +405,8 @@ end local event = require 'utils.event' event.on_init(on_init) +event.add(defines.events.on_gui_click, on_gui_click) event.add(defines.events.on_player_changed_position, on_player_changed_position) +event.add(defines.events.on_entity_died, on_entity_died) +event.add(defines.events.on_player_mined_entity, on_player_mined_entity) event.add(defines.events.on_player_joined_game, on_player_joined_game) \ No newline at end of file