Module:Changelog

From Deadlock Wiki
Revision as of 21:52, 24 December 2024 by Sur (talk | contribs) (pass is_herolab param to Update layout for changing the title from Updates to Hero Lab Updates)
Jump to navigation Jump to search

Overview

Generates lines of changes for all data pages. See [[Category:Changelog Dates]] for the dates of all changelogs, and Changelogs for list of all the data pages that contain a Changelog.

Functions

All of these functions are callable by wikitext, i.e. {{#invoke|Changelog|invokable_name|param1|paramN}}

write_changelog_by_tag

The main invokable that will be used. Given a specific tag, it outputs all relevant changelogs from all dates in a Template:Update history table.

Parameters

  • tag - Tag to search relevant changelogs for. Should be localized, i.e. Abrams for hero_atlas in english.
  • num_dates - (OPTIONAL) Number of dates to add, recommend 3 for articles. If unprovided, defaults to all.

Examples

For use on Pocket/Update history: {{#invoke:Changelog|write_changelog_by_tag|Pocket}}

Outputs

Update Changes

May 3, 2024

  • Fixed Flying Cloak teleporting players into geometry or out of the world

May 13, 2024


May 23, 2024

  • Pocket: Barrage T3 added, now heals Pocket for 100% of its damage (33% vs non-heroes)
    * Pocket: Fixed some issues with Barrage projectiles getting caught on map geometry
    * Pocket: Flying Cloak pathing improved, it will no longer bounce erratically off map geometry

May 30, 2024

June 6, 2024

June 13, 2024


June 20, 2024


For use on Pocket#Update history: {{#invoke:Changelog|write_changelog_by_tag|Pocket|3}}

Outputs

Update Changes

May 3, 2024

  • Fixed Flying Cloak teleporting players into geometry or out of the world

May 13, 2024

write_changelog_by_date_id

Write's a specific date's changelog, as opposed to a specific tag's changelog.

Parameters

  • date_id_to_write - Date-id to write, format yyyy-mm-dd, view all at [[Category:Changelog Dates]]

Examples

For a non-herolab patch page
{{#invoke:Changelog|write_changelog_by_date_id|2024-05-03}}

Updates
← N/A May 3, 2024 May 10, 2024

Patch notes

General Changes


* Added a Recommend A Friend button to the dashboard that you can use to send us requests for people to include in our playtesting
* Added a Resources page to the dashboard which contains a browsable item shop
* Added overhead text display when another hero uses active items
* The hotkeys F1-F5 to change cameras to allied heroes now maps directly to the order of heroes on the top bar left to right
* Added the Patron to the spectate-when-dead cycle if the enemy is in your base or everyone on your team is dead
* Added support for Flex Items in the Hero Sandbox
* Increased the range of the mouse sensitivity slider from 0.5→4.0 to 0.05→8.0
* Increased the default framerate cap from 120 to 400
* Improved UI display when endgame objectives are being attacked
* Added music for when the base is under attack
* Changed the local player icon on the the minimap to always be on top of enemy icons
* Shop music will now only play for shops players can access
* Postgame graphs now default to team stats rather than individual
* Added borders around hero icons on the minimap when watching replays/spectating
* Top bar now shows incoming players before they are fully connected
* Added console command to hide the bar at the bottom in replays ('citadel_hide_replay_hud 1' to hide it, 'citadel_hide_replay_hud 0' to bring it back)
* Various VOIP improvements
* Fixed open mic threshold
* Fixed various consistency issues with the presentation of Souls terminology, icons, etc
* Fixed Flying Cloak teleporting players into geometry or out of the world
* Fixed Warp Stone teleporting you through geometry
* Fixed Fixation decimal point display
* Fixed Parry animation not playing
* Fixed various issues with the spectate UI display
* Removed the slow climbing vertical recoil on Yamato's alt fire
* Fixed AP count not showing if you are dead, spectating a team mate or when holding alt/tab to upgrade your abilities

Gameplay Changes


* Troopers DPS vs Lane Guardians reduced from 44 to 36
* Objectives now have 80% damage reduction anti-backdoor defense when there haven't been creeps nearby in a while
* The uncapturable zipline nodes near your base now extend out 2 more nodes (this means attackers can't capture ziplines quite as close to the enemy base)
* You are now silenced while carrying the Urn
* Urn bounty increased from 900 + 160/minute to 900 + 200/minute
* Vaults base bounty increased from 150 to 200
* Abrams: Base Health increased from 550 to 600
* Abrams: Siphon DPS increased from 24 to 35
* Bebop: Weapon no longer has horizontal/vertical recoil
* Dynamo: Singularity DPS increased from 48 to 60
* Dynamo: Singularity T3 Max HP DPS increased from 3.2% to 3.8%
* Grey Talon: Charge Shot damage increased from 95 to 105
* Grey Talon: Charge Shot T2 damage reduced from 80 to 70
* Grey Talon: Guided Owl damage increased from 200 to 300
* Haze: Bullet Dance bonus Fire Rate reduced from +30 to +20
* Haze: Smoke Bomb duration scaling from Spirit improved from 0.2 to 0.3
* Infernus: Catalyst no longer slows Infernus to 1.3 m/s during the cast delay
* Infernus: Concussive Combustion damage increased from 130 to 160
* Kelvin: Frost Grenade T3 bonus damage increased from +100 to +175
* Lady Geist: Blood Bomb damage increased from 80 to 100
* Lady Geist: Blood Bomb T2 damage increased from +65 to +70
* Lady Geist: Blood Bomb tooltip fixed to reference the correct self damage type and that it can be reduced with armor
* Lady Geist: Malice damage amp per shard increased from 10% to 15%
* Lash: Grapple cooldown reduced from 55 to 45
* Lash: Flog Damage increased from 55 to 65
* Lash: Flog lifesteal from heroes increased from 70% to 80% of damage dealt
* Lash: Flog lifesteal from non-heroes reduced from 35% to 30% of damage dealt
* Lash: Death Slam T1 from +3m to +5m
* Lash: Fixed Death Slam's targeting cone not finding enemies near the edges
* Lash: Fixed Death Slam to only target enemies who stay in the targeting cone
* McGinnis: Heavy Barrage now reduces your speed rather than setting it to a low cap (by itself this change isn't a buff or a nerf, but it allows you to buy items to move faster during the ultimate)
* McGinnis: Heavy Barrage camera interaction with Fleetfoot Boots has been fixed
* Mo & Krill: Sand Blast range increased from 25m to 30m
* Mo & Krill: Sand Blast width increased from 3m to 5m
* Mo & Krill: Sand Blast is now permissive with small obstructions in the way
* Mo & Krill: Burrow no longer loses its state as you change elevations
* Mo & Krill: Burrow now knocks enemies up when you come up
* Mo & Krill: Combo DPS increased from 50 to 60
* Mo & Krill: No longer listed as a recommended new player hero
* Vindicta: Base Bullet Damage reduced from 15 to 14
* Vindicta: Bullet Damage gained per boon reduced from 0.88 to 0.7 (these are gained occasionally as you earn souls, up to 11 times)
* Vindicta: Stake T1 bonus duration reduced from +1.5s to +1.0s
* Vindicta: Is now a recommended hero for new players
* Yamato: Crimson Slash radius increased from 11m to 12m
* Yamato: Crimson Slash fire rate debuff duration increased from 3s to 4s
* Yamato: Crimson Slash T2 changed from "-5s Cooldown" to "10% Max Health heal on hero hit"
* Yamato: Crimson Slash T3 changed from "12% Max Health heal on hero hit" to "-6s Cooldown"
* Yamato: Power Slash T1 Bullet Resist increased from 40% to 60%
* Yamato: Flying Strike cooldown reduced from 35 to 20
* Yamato: Flying Strike T2 changed from "-15s Cooldown" to "+20 Cast Range"
* Yamato: Flying Strike range no longer scales with Spirit
* Yamato Shadow Explosion bonus Spirit per victim increased from 10 to 15
* Yamato: Shadow Explosion bonus Fire Rate per victim increased from 5 to 10
* Yamato: Shadow Explosion buff duration increased from 8s to 15s


For a herolab patch page
{{#invoke:Changelog|write_changelog_by_date_id|2024-12-06_HeroLab}}

date id 2024-12-06_HeroLab not found

write_data_pages_list

Writes list of all changelog data pages using the list of patches at Data:ChangelogConfigs.json. Used on [[Category:Changelog Dates]].

Parameters

None

Examples

{{#invoke:Changelog|write_data_pages_list}}

Outputs

Data:Changelog 2024-05-03.json
Data:Changelog 2024-05-10.json
Data:Changelog 2024-05-13.json
Data:Changelog 2024-05-16.json
Data:Changelog 2024-05-19.json
Data:Changelog 2024-05-23.json
Data:Changelog 2024-05-24.json
Data:Changelog 2024-05-30.json
Data:Changelog 2024-06-01.json
Data:Changelog 2024-06-06.json
Data:Changelog 2024-06-07.json
Data:Changelog 2024-06-13.json
Data:Changelog 2024-06-14.json
Data:Changelog 2024-06-16.json
Data:Changelog 2024-06-20.json

get_last_updated

Retrieve the last (or first) date that a tag was updated on. Planned to be used on a given tag's page, i.e. Abrams's infobox could mention that it was last updated on 2024-05-03, or that Mirage was released on 2024-05-03, etc.

Parameters

  • tag - Tag to search
  • last_or_first - Named optional - Must be last or first - defaults to last - Retrieves last or first date

Examples

Example using last {{#invoke:Changelog|get_last_updated|Basic Magazine}}

Outputs

May 30, 2024


Example using first {{#invoke:Changelog|get_last_updated|Basic Magazine|last_or_first=first}}

Outputs

May 30, 2024


local p = {};
local date_module = require('Module:Date')
local changelog_configs = mw.loadJsonData("Data:ChangelogConfigs.json")
local tag_tree = mw.loadJsonData("Data:ChangelogTagTree.json")
local dictionary_module = require('Module:Dictionary')

-- Takes in changelog_configs
-- Returns [oldest_id, next_oldest_id, ..., newest_id]
local function get_ordered_ids(data)
	-- Collect the keys into a table
    local keys = {}
    for key in pairs(data) do
        table.insert(keys, key)
    end

    -- Sort the keys (ascending order)
    table.sort(keys)

    -- Build an ordered array
    local ordered_array = {}
    for _, key in ipairs(keys) do
        table.insert(ordered_array, key)
    end

    return ordered_array	
end

--Global scope
local ordered_ids = get_ordered_ids(changelog_configs)

--Only Data:Changelog_05-03-2024.json is loaded right now, as it still needs work and for now it was uploaded manually, need an uploader script to handle it
--Returns all lines of a given date that has that tag
local function write_changelog_lines(id, config, tag_to_filter) 
	-- Get the data for the respective line
	local page_name = id_to_changelog_data_page(id)
	local title = mw.title.new(page_name)
	if not (title and title.exists) then
		return ""
	end
	local changelog_data = mw.loadJsonData(page_name)
	
	local lines = ""
	for index, line in ipairs(changelog_data) do
		description = line["Description"]
		if tag_to_filter == 'All' then
			lines = lines .. description .. "<br>"
		else
			for index2, tag in ipairs(line["Tags"]) do
				if tag == tag_to_filter then
					lines = lines .. description .. "<br>"
				end
			end
		end
	end
	return lines
end

-- Write changelogs table
p.write_changelog_by_tag = function(frame)
	tag = frame.args[1]
	num_dates_str = frame.args[2]
	local num_dates
	if (tag == nil) then return "tag parameter must be provided" end
	if (num_dates_str ~= nil) then
		num_dates = tonumber(num_dates_str)
		if (num_dates == nil) then return "num_dates parameter must be numerical" end
	end
	
	local template_title = "Update history table"
	local template_args = {}
	local content = "\n"
	
	-- Write changelog for each date
	for index, id in ipairs(ordered_ids) do
		config = changelog_configs[id]
		if (num_dates_str ~= nil and index > num_dates) then
			break
		else
			local date = config["date"]
			local frontfacing_date_id = config["frontfacing_date_id"]
			local template_title_row = "Update history table/row"
			local template_args_row = {}
			local changes
			--05-03-2024 to May 3, 2024
			template_args_row["update"] = frontfacing_date_id
			template_args_row["changes"] = write_changelog_lines(id, config, tag)
			if (template_args_row["changes"] ~= "") then
				changes = mw.getCurrentFrame():expandTemplate{ title = template_title_row, args = template_args_row }
			else
				changes = ""
			end
			
			content = content .. mw.getCurrentFrame():preprocess(changes) .. "\n"
		end
		index = index+1
	end
	
	template_args["contents"] = content
	
	return mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args }
end

function id_to_changelog_data_page(id)
	return "Data:Changelog " .. id .. ".json"	
end

--Shows all changelog date data pages as a list of pages
p.write_data_pages_list = function(frame)
	local str = ""
	
	for i, id in ipairs(ordered_ids) do
		str = str .. "[[" .. id_to_changelog_data_page(id) .. "]]<br>"
	end
	
	return str
end

p.write_changelog_by_date_id = function(frame)
	local req_date_id = frame.args[1]
	--req = requested, as this is the requested changelog
	local config = changelog_configs[req_date_id]
	if config == nil then return "date id " .. req_date_id .. " not found" end
	
	local frontfacing_req_date_id = config["frontfacing_date_id"]
	local req_is_herolab = config["is_hero_lab"]
	
	-- Determine the previous and next update
	-- Find the index in dates list
	--ordered_ids defined at global scope
	local previous_ff_id = ''
	local the_ff_id = ''
	local next_ff_id = ''
	local id_found = false
	local frontfacing_date_id
	local is_herolab
	for i, id in ipairs(ordered_ids) do
		frontfacing_date_id = changelog_configs[id]["frontfacing_date_id"]
		is_herolab = changelog_configs[id]["is_hero_lab"]
		if is_herolab == req_is_herolab then --only look at herolab or non-herolab patches, not mix and match
			if frontfacing_date_id == frontfacing_req_date_id then
				--id found
				the_ff_id = frontfacing_date_id
				the_id = id
				id_found = true
			elseif id_found and next_ff_id == '' then --on next iteration, save the next id
				next_ff_id = frontfacing_date_id
				break
			end
			
			if not id_found then
				previous_ff_id = frontfacing_date_id -- only update previous if the_id isnt found
			end
		end
	end
	if not id_found then
		return "date_id " .. req_date_id .. " not found"
	end
	
	local template_title = 'Update layout'
	local template_args = {
		['prev_update'] = prev_ff_id,
		['current_update'] = the_ff_id,
		['next_update'] = next_ff_id,
		['source'] = config[link],
		['source_title'] = the_ff_id .. ' Update',
		['is_herolab'] = req_is_herolab,
		['notes'] = mw.getCurrentFrame():preprocess(write_changelog_lines(the_id, config, 'All'))
	}

	return mw.getCurrentFrame():expandTemplate{title = template_title, args = template_args}
end

p.get_last_updated = function(frame)
	local tag_to_search = frame.args[1]
	local last_or_first = frame.args["last_or_first"]
	if last_or_first == nil or last_or_first == 'last' then
		last_or_first = 'last'
	else
		last_or_first = 'first'
	end
	
	local list = {}
	if last_or_first == 'last' then
		list = ordered_ids
	else
		-- Create the list in reverse
		for i = #ordered_ids, 1, -1 do
			table.insert(list, ordered_ids[i])
		end
	end
    
	
	-- Iterate changelog dates
	local frontfacing_date_id
	for i, id in ipairs(list) do
		-- Get frontfacing date from id
		frontfacing_date_id = changelog_configs[id]["frontfacing_date_id"]
		
		-- If next changelog data page doesn't yet exist, return latest page that exists
		local page_name = id_to_changelog_data_page(id)
		local title = mw.title.new(page_name)
		if not (title and title.exists) then
			return '[[Update:' .. frontfacing_date_id .. '|' .. frontfacing_date_id .. ']]'
		end
		
		local changelog_data = mw.loadJsonData(page_name)
		
		-- Iterate lines
		for _, line in ipairs(changelog_data) do
			local tags = line['Tags']
			
			-- Iterate tags
			for _, tag in ipairs(tags) do
				if tag_to_search == tag then
					return '[[Update:' .. frontfacing_date_id .. '|' .. frontfacing_date_id .. ']]'
				end
			end
		end
	end
	
	return dictionary_module.translate('N/A')
end

function p.write_tag_tree(frame)
	return p.write_branch(tag_tree, 1)
end
	
function p.write_branch(branch, depth)
	local list_str = ""
	if branch == nil then return "" end
	
	for parent, children in pairs(branch) do
		-- If parent starts with < or ends with >, its referencing individual page
		-- the link won't work, so instead we just display the parent raw
		local parent_str
		if string.sub(parent, 1, 1) == '<' or string.sub(parent, -1) == '>' then
			parent_str = parent
		else
			parent_str = string.format("[[%s#Update history|%s]]", parent, parent)
		end
		
		list_str = list_str .. string.rep("*", depth) .. parent_str .. "\n"
		if children ~= nil then
			list_str = list_str .. p.write_branch(children, depth+1)
		end
	end
	
	return list_str
end

return p