Module:Changelog

From Deadlock Wiki
Revision as of 22:31, 24 December 2024 by Sur (talk | contribs) (use new lines instead of <br> to separate changelog lines)
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


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 .. "\n"
		else
			for index2, tag in ipairs(line["Tags"]) do
				if tag == tag_to_filter then
					lines = lines .. description .. "\n"
				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