diff --git a/locale/en/rpg.cfg b/locale/en/rpg.cfg index 53b156ce..43e0930f 100644 --- a/locale/en/rpg.cfg +++ b/locale/en/rpg.cfg @@ -106,14 +106,14 @@ flameboots_label=Enable flame boots? flameboots_tooltip=When the bullets simply don´t bite. explosive_bullets_label=Enable explosive bullets? explosive_bullets_tooltip=Hurts the biters a bit extra -magic_label=Enable spawning with raw-fish? +magic_label=Enable spawning with fish? toggle_cast_spell_label=Toggles the ability to cast spells. cast_spell_enabled_label=Casting spells with fish has been enabled! cast_spell_disabled_label=Casting spells with fish has been disabled! magic_tooltip=When simply constructing items is not enough.\nNOTE! Use Raw-fish to cast spells. -magic_spell=Select what entity to spawn +magic_spell=Select your spell: allocation_settings_label=Allocations Settings: -allocation_label=Select what skill to auto-allocate. +allocation_label=Select your auto-allocate skill. allocation_tooltip=This will automatically allocate all available points to the given node. diff --git a/maps/mountain_fortress_v3/entities.lua b/maps/mountain_fortress_v3/entities.lua index b373ce66..539453ef 100644 --- a/maps/mountain_fortress_v3/entities.lua +++ b/maps/mountain_fortress_v3/entities.lua @@ -245,11 +245,9 @@ local function set_train_final_health(final_damage_amount, repair) local carriages = WPT.get('carriages') if carriages then - for _ = 1, 10 do - for i = 1, #carriages do - local entity = carriages[i] - DefenseSystem.enable_robotic_defense(entity.position) - end + for i = 1, #carriages do + local entity = carriages[i] + DefenseSystem.enable_robotic_defense(entity.position) end end local p = { diff --git a/modules/rpg/functions.lua b/modules/rpg/functions.lua index 7d31378c..bb9dc85c 100644 --- a/modules/rpg/functions.lua +++ b/modules/rpg/functions.lua @@ -801,6 +801,14 @@ function Public.get_melee_modifier(player) return total end +function Public.get_player_level(player) + local rpg_t = Public.get_value_from_player(player.index) + if not rpg_t then + return false + end + return rpg_t.level +end + function Public.get_area_of_effect_range(player) local rpg_t = Public.get_value_from_player(player.index) if not rpg_t then diff --git a/modules/rpg/main.lua b/modules/rpg/main.lua index 37ffc341..a36c9f90 100644 --- a/modules/rpg/main.lua +++ b/modules/rpg/main.lua @@ -970,9 +970,7 @@ local function on_player_used_capsule(event) spell.callback(data) - local msg = player.name .. ' casted ' .. spell.entityName .. '. ' - - rpg_t.last_spawned = game.tick + spell.tick + rpg_t.last_spawned = game.tick + spell.cooldown Public.update_mana(player) local reward_xp = spell.mana_cost * 0.085 @@ -982,7 +980,10 @@ local function on_player_used_capsule(event) Public.gain_xp(player, reward_xp) - AntiGrief.insert_into_capsule_history(player, position, msg) + if spell.log_spell then + local msg = player.name .. ' casted ' .. spell.entityName .. '. ' + AntiGrief.insert_into_capsule_history(player, position, msg) + end end local function on_player_changed_surface(event) diff --git a/modules/rpg/settings.lua b/modules/rpg/settings.lua index 69eee080..09b8b5be 100644 --- a/modules/rpg/settings.lua +++ b/modules/rpg/settings.lua @@ -36,7 +36,9 @@ local function create_input_element(frame, type, value, items, index) return frame.add({type = 'checkbox', state = value}) end if type == 'label' then - return frame.add({type = 'label', caption = value}) + local label = frame.add({type = 'label', caption = value}) + label.style.font = 'default-listbox' + return label end if type == 'dropdown' then return frame.add({type = 'drop-down', items = items, selected_index = index}) @@ -47,8 +49,12 @@ end local function create_custom_label_element(frame, sprite, localised_string, value) local t = frame.add({type = 'flow'}) t.add({type = 'label', caption = '[' .. sprite .. ']'}) - t.add({type = 'label', caption = localised_string}) - return t.add({type = 'label', caption = value}) + local heading = t.add({type = 'label', caption = localised_string}) + heading.style.font = 'default-listbox' + local subheading = t.add({type = 'label', caption = value}) + subheading.style.font = 'default-listbox' + + return subheading end function Public.update_spell_gui_indicator(player) @@ -185,8 +191,6 @@ function Public.extra_settings(player) main_frame_style.width = 500 main_frame.auto_center = true - inside_table.add({type = 'line'}) - local info_text = inside_table.add({type = 'label', caption = ({'rpg_settings.info_text_label'})}) local info_text_style = info_text.style info_text_style.font = 'default-bold' @@ -668,9 +672,7 @@ function Public.settings_tooltip(player) local main_frame, inside_table = Gui.add_main_frame_with_toolbar(player, 'center', settings_tooltip_frame, nil, close_settings_tooltip_frame, 'Spell info') local inside_table_style = inside_table.style - inside_table_style.width = 500 - - inside_table.add({type = 'line'}) + inside_table_style.width = 530 local info_text = inside_table.add({type = 'label', caption = ({'rpg_settings.spellbook_label'})}) local info_text_style = info_text.style @@ -708,17 +710,16 @@ function Public.settings_tooltip(player) table.sort(spells, comparator) for _, entity in pairs(spells) do + local cooldown = (entity.cooldown / 60) .. 's' if entity.type == 'item' then - local text = '[item=' .. entity.entityName .. '] requires ' .. entity.mana_cost .. ' mana to cast. Level: ' .. entity.level + local text = '[item=' .. entity.entityName .. '] ▪️ Level: [font=default-bold]' .. entity.level .. '[/font] Mana: [font=default-bold]' .. entity.mana_cost .. '[/font]. Cooldown: [font=default-bold]' .. cooldown .. '[/font]' create_input_element(normal_spell_grid, 'label', text) elseif entity.type == 'entity' then - local text = '[entity=' .. entity.entityName .. '] requires ' .. entity.mana_cost .. ' mana to cast. Level: ' .. entity.level + local text = '[entity=' .. entity.entityName .. '] ▪️ Level: [font=default-bold]' .. entity.level .. '[/font] Mana: [font=default-bold]' .. entity.mana_cost .. '[/font]. Cooldown: [font=default-bold]' .. cooldown .. '[/font]' create_input_element(normal_spell_grid, 'label', text) end end - normal_spell_pane.add({type = 'line'}) - local special_spell_pane = inside_table.add({type = 'scroll-pane'}) local ss = special_spell_pane.style ss.vertically_squashable = true @@ -727,6 +728,8 @@ function Public.settings_tooltip(player) ss.right_padding = 5 ss.top_padding = 5 + normal_spell_pane.add({type = 'line'}) + local special_spells = special_spell_pane.add({type = 'label', caption = ({'rpg_settings.special_spells_label'})}) local special_spells_style = special_spells.style special_spells_style.font = 'heading-3' @@ -738,9 +741,10 @@ function Public.settings_tooltip(player) local special_spell_grid = special_spell_pane.add({type = 'table', column_count = 1}) for _, entity in pairs(spells) do + local cooldown = (entity.cooldown / 60) .. 's' if entity.type == 'special' then - local text = 'requires ' .. entity.mana_cost .. ' mana to cast. Level: ' .. entity.level - create_custom_label_element(special_spell_grid, entity.sprite, entity.name, text) + local text = '▪️ Level: [font=default-bold]' .. entity.level .. '[/font] Mana: [font=default-bold]' .. entity.mana_cost .. '[/font]. Cooldown: [font=default-bold]' .. cooldown .. '[/font]' + create_custom_label_element(special_spell_grid, entity.special_sprite, entity.name, text) end end end diff --git a/modules/rpg/spells.lua b/modules/rpg/spells.lua index b5ed4493..173679d4 100644 --- a/modules/rpg/spells.lua +++ b/modules/rpg/spells.lua @@ -7,7 +7,7 @@ local random = math.random local floor = math.floor local states = { - ['attack'] = 'nuclear-smoke', + ['attack'] = 'fire-smoke', ['support'] = 'poison-capsule-smoke' } @@ -76,7 +76,6 @@ local function area_of_effect(player, position, state, radius, callback, find_en else callback(p) end - cs.create_trivial_smoke({name = states[state], position = p}) end end @@ -222,7 +221,7 @@ spells[#spells + 1] = { level = 1, type = 'item', mana_cost = 60, - tick = 100, + cooldown = 100, aoe = true, enabled = true, sprite = 'recipe/stone-wall', @@ -236,7 +235,7 @@ spells[#spells + 1] = { level = 1, type = 'item', mana_cost = 50, - tick = 100, + cooldown = 100, aoe = true, enabled = true, sprite = 'recipe/wooden-chest', @@ -250,7 +249,7 @@ spells[#spells + 1] = { level = 10, type = 'item', mana_cost = 110, - tick = 200, + cooldown = 200, aoe = true, enabled = true, sprite = 'recipe/iron-chest', @@ -264,7 +263,7 @@ spells[#spells + 1] = { level = 30, type = 'item', mana_cost = 150, - tick = 300, + cooldown = 300, aoe = true, enabled = true, sprite = 'recipe/steel-chest', @@ -278,7 +277,7 @@ spells[#spells + 1] = { level = 1, type = 'item', mana_cost = 80, - tick = 100, + cooldown = 100, aoe = true, enabled = true, sprite = 'recipe/transport-belt', @@ -292,7 +291,7 @@ spells[#spells + 1] = { level = 10, type = 'item', mana_cost = 110, - tick = 200, + cooldown = 200, aoe = true, enabled = true, sprite = 'recipe/fast-transport-belt', @@ -306,7 +305,7 @@ spells[#spells + 1] = { level = 30, type = 'item', mana_cost = 150, - tick = 300, + cooldown = 300, aoe = true, enabled = true, sprite = 'recipe/express-transport-belt', @@ -320,7 +319,7 @@ spells[#spells + 1] = { level = 1, type = 'item', mana_cost = 80, - tick = 100, + cooldown = 100, aoe = true, enabled = true, sprite = 'recipe/underground-belt', @@ -334,7 +333,7 @@ spells[#spells + 1] = { level = 10, type = 'item', mana_cost = 110, - tick = 200, + cooldown = 200, aoe = true, enabled = true, sprite = 'recipe/fast-underground-belt', @@ -348,7 +347,7 @@ spells[#spells + 1] = { level = 30, type = 'item', mana_cost = 150, - tick = 300, + cooldown = 300, aoe = true, enabled = true, sprite = 'recipe/express-underground-belt', @@ -362,7 +361,7 @@ spells[#spells + 1] = { level = 1, type = 'item', mana_cost = 50, - tick = 100, + cooldown = 100, aoe = true, enabled = true, sprite = 'recipe/pipe', @@ -376,7 +375,7 @@ spells[#spells + 1] = { level = 1, type = 'item', mana_cost = 100, - tick = 100, + cooldown = 100, aoe = true, enabled = true, sprite = 'recipe/pipe-to-ground', @@ -390,7 +389,7 @@ spells[#spells + 1] = { level = 30, type = 'entity', mana_cost = 100, - tick = 350, + cooldown = 350, aoe = true, enabled = true, sprite = 'entity/tree-05', @@ -404,7 +403,7 @@ spells[#spells + 1] = { level = 60, type = 'entity', mana_cost = 80, - tick = 350, + cooldown = 350, aoe = true, enabled = true, sprite = 'entity/sand-rock-big', @@ -419,7 +418,7 @@ spells[#spells + 1] = { biter = true, type = 'entity', mana_cost = 55, - tick = 200, + cooldown = 200, enabled = true, sprite = 'entity/small-biter', callback = function(data) @@ -433,7 +432,7 @@ spells[#spells + 1] = { biter = true, type = 'entity', mana_cost = 55, - tick = 200, + cooldown = 200, enabled = true, sprite = 'entity/small-spitter', callback = function(data) @@ -447,7 +446,7 @@ spells[#spells + 1] = { biter = true, type = 'entity', mana_cost = 100, - tick = 300, + cooldown = 300, enabled = true, sprite = 'entity/medium-biter', callback = function(data) @@ -461,7 +460,7 @@ spells[#spells + 1] = { biter = true, type = 'entity', mana_cost = 100, - tick = 300, + cooldown = 300, enabled = true, sprite = 'entity/medium-spitter', callback = function(data) @@ -475,8 +474,9 @@ spells[#spells + 1] = { biter = true, type = 'entity', mana_cost = 800, - tick = 1420, + cooldown = 1420, enabled = false, + log_spell = true, sprite = 'entity/biter-spawner', callback = function(data) create_entity(data) @@ -489,8 +489,9 @@ spells[#spells + 1] = { biter = true, type = 'entity', mana_cost = 800, - tick = 1420, + cooldown = 1420, enabled = false, + log_spell = true, sprite = 'entity/spitter-spawner', callback = function(data) create_entity(data) @@ -507,8 +508,9 @@ spells[#spells + 1] = { level = 10, type = 'item', mana_cost = 40, - tick = 150, + cooldown = 150, enabled = true, + log_spell = true, sprite = 'recipe/shotgun-shell', callback = function(data) create_projectiles(data) @@ -524,8 +526,9 @@ spells[#spells + 1] = { level = 30, type = 'item', mana_cost = 100, - tick = 150, + cooldown = 150, enabled = true, + log_spell = true, sprite = 'recipe/grenade', callback = function(data) create_projectiles(data) @@ -541,8 +544,9 @@ spells[#spells + 1] = { level = 50, type = 'item', mana_cost = 225, - tick = 200, + cooldown = 200, enabled = true, + log_spell = true, sprite = 'recipe/cluster-grenade', callback = function(data) create_projectiles(data) @@ -558,8 +562,9 @@ spells[#spells + 1] = { level = 30, type = 'item', mana_cost = 125, - tick = 150, + cooldown = 150, enabled = true, + log_spell = true, sprite = 'recipe/cannon-shell', callback = function(data) create_projectiles(data) @@ -575,8 +580,9 @@ spells[#spells + 1] = { level = 50, type = 'item', mana_cost = 250, - tick = 200, + cooldown = 200, enabled = true, + log_spell = true, sprite = 'recipe/explosive-cannon-shell', callback = function(data) create_projectiles(data) @@ -592,8 +598,9 @@ spells[#spells + 1] = { level = 70, type = 'item', mana_cost = 400, - tick = 200, + cooldown = 200, enabled = true, + log_spell = true, sprite = 'recipe/uranium-cannon-shell', callback = function(data) create_projectiles(data) @@ -610,8 +617,9 @@ spells[#spells + 1] = { level = 40, type = 'item', mana_cost = 60, - tick = 320, + cooldown = 320, enabled = true, + log_spell = true, sprite = 'recipe/rocket', callback = function(data) create_projectiles(data) @@ -628,9 +636,11 @@ spells[#spells + 1] = { level = 70, type = 'special', mana_cost = 100, - tick = 100, + cooldown = 100, enabled = true, - sprite = 'recipe=explosives', + log_spell = true, + sprite = 'recipe/explosives', + special_sprite = 'recipe=explosives', callback = function(data) local self = data.self local player = data.player @@ -668,10 +678,13 @@ spells[#spells + 1] = { force = 'player', level = 45, type = 'special', - mana_cost = 150, - tick = 100, + mana_cost = 400, + cooldown = 2400, enabled = true, - sprite = 'recipe=repair-pack', + enforce_cooldown = true, + log_spell = true, + sprite = 'recipe/repair-pack', + special_sprite = 'recipe=repair-pack', callback = function(data) local self = data.self local rpg_t = data.rpg_t @@ -710,13 +723,14 @@ spells[#spells + 1] = { force = 'player', level = 50, type = 'special', - mana_cost = 70, - tick = 100, + mana_cost = 700, + cooldown = 900, enabled = true, - sprite = 'virtual-signal=signal-S', + enforce_cooldown = true, + sprite = 'virtual-signal/signal-S', + special_sprite = 'virtual-signal=signal-S', callback = function(data) local self = data.self - local rpg_t = data.rpg_t local player = data.player local position = data.position @@ -728,14 +742,12 @@ spells[#spells + 1] = { 'attack', range, function(p) - if self.mana_cost < rpg_t.mana then - do_projectile(player.surface, 'acid-stream-spitter-big', p, player.force, p) - Public.remove_mana(player, self.mana_cost) - end + do_projectile(player.surface, 'acid-stream-spitter-big', p, player.force, p) end, false ) + Public.remove_mana(player, self.mana_cost) Public.cast_spell(player) end } @@ -748,9 +760,10 @@ spells[#spells + 1] = { level = 1000, type = 'special', mana_cost = 10000, -- they who know, will know - tick = 320, + cooldown = 320, enabled = false, - sprite = 'entity=tank', + sprite = 'entity/tank', + special_sprite = 'entity=tank', callback = function(data) create_entity(data) end @@ -764,9 +777,11 @@ spells[#spells + 1] = { level = 2000, type = 'special', mana_cost = 19500, -- they who know, will know - tick = 320, + cooldown = 320, enabled = false, - sprite = 'entity=spidertron', + log_spell = true, + sprite = 'entity/spidertron', + special_sprite = 'entity=spidertron', callback = function(data) create_entity(data) end @@ -783,9 +798,10 @@ spells[#spells + 1] = { level = 50, type = 'special', mana_cost = 140, - tick = 320, + cooldown = 320, enabled = true, - sprite = 'item=raw-fish', + sprite = 'item/raw-fish', + special_sprite = 'item=raw-fish', callback = function(data) insert_onto(data) end @@ -802,9 +818,10 @@ spells[#spells + 1] = { level = 25, type = 'special', mana_cost = 140, - tick = 320, + cooldown = 320, enabled = true, sprite = 'item=explosives', + special_sprite = 'item/explosives', callback = function(data) insert_onto(data) end @@ -820,9 +837,11 @@ spells[#spells + 1] = { level = 60, type = 'special', mana_cost = 150, - tick = 320, + cooldown = 320, enabled = true, - sprite = 'entity=compilatron', + log_spell = true, + sprite = 'entity/compilatron', + special_sprite = 'entity=compilatron', callback = function(data) local self = data.self local player = data.player @@ -845,9 +864,10 @@ spells[#spells + 1] = { level = 50, type = 'special', mana_cost = 220, - tick = 320, + cooldown = 320, enabled = true, - sprite = 'recipe=distractor-capsule', + sprite = 'recipe/distractor-capsule', + special_sprite = 'recipe=distractor-capsule', callback = function(data) create_projectiles(data) end @@ -860,9 +880,11 @@ spells[#spells + 1] = { level = 60, type = 'special', mana_cost = 340, - tick = 2000, + cooldown = 2000, enabled = true, - sprite = 'virtual-signal=signal-W', + log_spell = true, + sprite = 'virtual-signal/signal-W', + special_sprite = 'virtual-signal=signal-W', callback = function(data) local player = data.player local surface = data.surface @@ -888,10 +910,12 @@ spells[#spells + 1] = { level = 25, type = 'special', mana_cost = 100, - tick = 2000, + cooldown = 2000, check_if_active = true, enabled = true, - sprite = 'virtual-signal=signal-info', + log_spell = true, + sprite = 'virtual-signal/signal-info', + special_sprite = 'virtual-signal=signal-info', callback = function(data) local self = data.self local player = data.player @@ -913,13 +937,15 @@ spells[#spells + 1] = { entityName = 'eternal_blades', target = false, force = 'player', - level = 25, + level = 200, type = 'special', - mana_cost = 100, - tick = 2000, - check_if_active = true, + mana_cost = 350, + cooldown = 2000, enabled = false, - sprite = 'virtual-signal=signal-info', + enforce_cooldown = false, + log_spell = true, + sprite = 'virtual-signal/signal-info', + special_sprite = 'virtual-signal=signal-info', callback = function(data) local self = data.self local player = data.player @@ -927,7 +953,9 @@ spells[#spells + 1] = { local range = Public.get_area_of_effect_range(player) - local damage = 34 + local damage = Public.get_player_level(player) + + damage = damage / 4 area_of_effect( player, @@ -952,7 +980,8 @@ spells[#spells + 1] = { end else if entity.valid then - entity.health = entity.health - damage * 0.05 + log(serpent.block(entity.name)) + entity.health = entity.health - damage if entity.health <= 0 then entity.die(entity.force.name, player.character) end @@ -1059,13 +1088,13 @@ function Public.set_new_spell(tbl) if tbl then if not tbl.name then - return error('A spell requires a name. string', 2) + return error('A spell requires a name. ', 2) end if not tbl.entityName then - return error('A spell requires an object to create. string', 2) + return error('A spell requires an object to create. ', 2) end if not tbl.target then - return error('A spell requires position. boolean', 2) + return error('A spell requires position. ', 2) end if not tbl.amount then return error('A spell requires an amount of creation. ', 2) @@ -1077,7 +1106,7 @@ function Public.set_new_spell(tbl) return error('A spell requires damage. ', 2) end if not tbl.force then - return error('A spell requires a force. string', 2) + return error('A spell requires a force. ', 2) end if not tbl.level then return error('A spell requires a level. ', 2) @@ -1088,11 +1117,20 @@ function Public.set_new_spell(tbl) if not tbl.mana_cost then return error('A spell requires mana_cost. ', 2) end - if not tbl.tick then - return error('A spell requires tick. ', 2) + if not tbl.cooldown then + return error('A spell requires cooldown. ', 2) + end + if not tbl.enforce_cooldown then + return error('A spell requires enforce_cooldown. ', 2) end if not tbl.enabled then - return error('A spell requires enabled. boolean', 2) + return error('A spell requires enabled. ', 2) + end + if not tbl.log_spell then + return error('A spell requires log_spell. ', 2) + end + if not tbl.check_if_active then + return error('A spell requires check_if_active. ', 2) end Public.all_spells[#Public.all_spells + 1] = tbl @@ -1124,9 +1162,14 @@ function Public.disable_cooldowns_on_spells() local new_spells = {} for i = 1, #spells do - if spells[i].enabled then - spells[i].tick = 0 - new_spells[#new_spells + 1] = spells[i] + local spell = spells[i] + if spell.enabled then + if not spell.enforce_cooldown then + spell.cooldown = 0 + new_spells[#new_spells + 1] = spell + else + new_spells[#new_spells + 1] = spell + end end end