Jump to content

Module:Changelog: Difference between revisions

From Deadlock Wiki
Sur (talk | contribs)
m Early version of reworked changelogs to go by id instead of date
Sur (talk | contribs)
m get_last_updated now returns latest id instead of date; fixed bug with loading non-existing json page during testing phase
Line 149: Line 149:
['source'] = 'https://forums.playdeadlock.com/threads/09-26-2024-update.33015/',
['source'] = 'https://forums.playdeadlock.com/threads/09-26-2024-update.33015/',
['source_title'] = the_id .. ' Update',
['source_title'] = the_id .. ' Update',
['notes'] = write_changelog_lines(id, changelog_configs[the_id], 'All')
['notes'] = write_changelog_lines(the_id, changelog_configs[the_id], 'All')
}
}


Line 160: Line 160:
-- Iterate changelog dates
-- Iterate changelog dates
for i, id in ipairs(ordered_ids) do
for i, id in ipairs(ordered_ids) do
local config = changelog_configs[id]
-- If next changelog data page doesn't yet exist, return latest page that exists
local date = config["date"]
local page_name = id_to_changelog_data_page(id)
local changelog_data = mw.loadJsonData(id_to_changelog_data_page(id))
local title = mw.title.new(page_name)
if not (title and title.exists) then
return '[[Update:' .. id .. '|' .. id .. ']]'
end
local changelog_data = mw.loadJsonData(page_name)
-- Iterate lines
-- Iterate lines
Line 171: Line 176:
for _, tag in ipairs(tags) do
for _, tag in ipairs(tags) do
if tag_to_search == tag then
if tag_to_search == tag then
return '[[Update:' .. date .. '|' .. date .. ']]'
return '[[Update:' .. id .. '|' .. id .. ']]'
end
end
end
end

Revision as of 22:12, 21 December 2024

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 Script error: The function "write_changelog_by_tag" does not exist.


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

Outputs

Script error: The function "write_changelog_by_tag" does not exist.

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 2024-05-03 2024-05-10

Source: 2024-05-03 Update

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 {{PageRef|Shop|alt_name=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 {{PageRef|Patron}} to the spectate-when-dead cycle if the enemy is in your base or everyone on your team is dead
* Added support for {{PageRef|Flex Slot|alt_name=Flex}} {{PageRef|Item}}s in the Hero {{PageRef|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 {{PageRef|Map|alt_name=minimap}} to always be on top of enemy icons
* {{PageRef|Shop}} music will now only play for {{PageRef|Shop|alt_name=shops}} players can access
* Postgame graphs now default to team stats rather than individual
* Added borders around hero icons on the {{PageRef|Map|alt_name=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 {{PageRef|Souls}} terminology, icons, etc
* Fixed {{PageRef|Flying Cloak}} teleporting players into geometry or out of the world
* Fixed {{PageRef|Warp Stone}} teleporting you through geometry
* Fixed {{PageRef|Fixation}} decimal point display
* Fixed {{PageRef|Parry}} animation not playing
* Fixed various issues with the spectate UI display
* Removed the slow climbing vertical recoil on {{PageRef|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


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

Updates
← N/A N/A →

Source: Update

Patch notes


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

2024-05-30


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

Outputs

2024-05-30


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

--Expand the Update history table/row template for 1 specific changelog
local function write_changelog(id, config, tag_to_filter)
	local date = config["date"]
	local template_title = "Update history table/row"
	local template_args = {}
	--05-03-2024 to May 3, 2024
	template_args["update"] = date_module.format_date(date)
	template_args["changes"] = write_changelog_lines(id, config, tag_to_filter)
	if (template_args["changes"] ~= "") then
		return mw.getCurrentFrame():expandTemplate{ title = template_title, args = template_args }
	else
		return ""
	end
end

-- Write changelogs table
p.write_changelogs = 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
	local index = 0
	for id, config in pairs(changelog_configs) do
		if (num_dates_str ~= nil and index > num_dates) then
			break
		else
			content = content .. write_changelog(id, config, tag) .. "\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 date_id_to_write = frame.args[1]
	
	-- Determine the previous and next update
	-- Find the index in dates list
	--ordered_ids defined at global scope
	local previous_id = ''
	local the_id = ''
	local next_id = ''
	local id_found = false
	for i, id in ipairs(ordered_ids) do
		if id == date_id_to_write then
			--id found
			the_id = id
			id_found = true
		elseif id_found and next_id == '' then --on next iteration, save the next id
			next_id = id
			break
		end
		
		if not id_found then
			previous_id = id -- only update previous if the_id isnt found
		end
	end
	
	local template_title = 'Update layout'
	local template_args = {
		['prev_update'] = prev_id,
		['current_update'] = the_id,
		['next_update'] = next_id,
		['source'] = 'https://forums.playdeadlock.com/threads/09-26-2024-update.33015/',
		['source_title'] = the_id .. ' Update',
		['notes'] = write_changelog_lines(the_id, changelog_configs[the_id], '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]
	
	-- Iterate changelog dates
	for i, id in ipairs(ordered_ids) do
		-- 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:' .. id .. '|' .. 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:' .. id .. '|' .. 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
		list_str = list_str .. string.rep("*", depth) .. string.format("[[%s#Update history|%s]]\n", parent, parent)
		if children ~= nil then
			list_str = list_str .. p.write_branch(children, depth+1)
		end
	end
	
	return list_str
end

return p