<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AChart_data%2Franging_guild_target_average_score</id>
	<title>Module:Chart data/ranging guild target average score - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AChart_data%2Franging_guild_target_average_score"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Chart_data/ranging_guild_target_average_score&amp;action=history"/>
	<updated>2026-05-05T15:06:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Chart_data/ranging_guild_target_average_score&amp;diff=34438&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local helper = require(&#039;Module:Chart data&#039;)  local attRollMin = 0 local attRollMax = 55000 local attRollStep = 200  -- Source for def rolls: -- https://discord.com/channels/177206626514632704/269673599554551808/1070094764797595729 local buckets = { 	{ name = &#039;miss&#039;, score = 0 }, 	{ name = &#039;black&#039;, score = 10, defRoll = 1000 }, 	{ name = &#039;blue&#039;, score = 20, defRoll = 2000 }, 	{ name = &#039;red&#039;, score = 30, defRoll = 3000 }, 	{ name = &#039;yellow&#039;, score = 50, defRoll = 4000 },...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Chart_data/ranging_guild_target_average_score&amp;diff=34438&amp;oldid=prev"/>
		<updated>2024-10-16T23:00:46Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local helper = require(&amp;#039;Module:Chart data&amp;#039;)  local attRollMin = 0 local attRollMax = 55000 local attRollStep = 200  -- Source for def rolls: -- https://discord.com/channels/177206626514632704/269673599554551808/1070094764797595729 local buckets = { 	{ name = &amp;#039;miss&amp;#039;, score = 0 }, 	{ name = &amp;#039;black&amp;#039;, score = 10, defRoll = 1000 }, 	{ name = &amp;#039;blue&amp;#039;, score = 20, defRoll = 2000 }, 	{ name = &amp;#039;red&amp;#039;, score = 30, defRoll = 3000 }, 	{ name = &amp;#039;yellow&amp;#039;, score = 50, defRoll = 4000 },...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local helper = require(&amp;#039;Module:Chart data&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local attRollMin = 0&lt;br /&gt;
local attRollMax = 55000&lt;br /&gt;
local attRollStep = 200&lt;br /&gt;
&lt;br /&gt;
-- Source for def rolls:&lt;br /&gt;
-- https://discord.com/channels/177206626514632704/269673599554551808/1070094764797595729&lt;br /&gt;
local buckets = {&lt;br /&gt;
	{ name = &amp;#039;miss&amp;#039;, score = 0 },&lt;br /&gt;
	{ name = &amp;#039;black&amp;#039;, score = 10, defRoll = 1000 },&lt;br /&gt;
	{ name = &amp;#039;blue&amp;#039;, score = 20, defRoll = 2000 },&lt;br /&gt;
	{ name = &amp;#039;red&amp;#039;, score = 30, defRoll = 3000 },&lt;br /&gt;
	{ name = &amp;#039;yellow&amp;#039;, score = 50, defRoll = 4000 },&lt;br /&gt;
	{ name = &amp;#039;bullseye&amp;#039;, score = 100, defRoll = 7000 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function accuracy(attRoll, defRoll)&lt;br /&gt;
    if attRoll &amp;lt; defRoll then&lt;br /&gt;
    	return attRoll / (2 * defRoll + 2)&lt;br /&gt;
    else&lt;br /&gt;
    	return 1 - ((defRoll + 2) / (2 * attRoll + 2))&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rollNextBucket(oddsAccum, attRoll, currentBucket, nextBucket)&lt;br /&gt;
	local successChance = accuracy(attRoll, nextBucket.defRoll)&lt;br /&gt;
	local cumulativeChance = oddsAccum[currentBucket.name] * successChance&lt;br /&gt;
	oddsAccum[currentBucket.name] = oddsAccum[currentBucket.name] - cumulativeChance&lt;br /&gt;
	oddsAccum[nextBucket.name] = cumulativeChance&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function calcOdds(attRoll)&lt;br /&gt;
    local odds = { miss = 1 }&lt;br /&gt;
    for i = 2, #buckets do&lt;br /&gt;
    	rollNextBucket(odds, attRoll, buckets[i - 1], buckets[i])&lt;br /&gt;
    end&lt;br /&gt;
    return odds&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function scorePerShot(odds)&lt;br /&gt;
	local s = 0&lt;br /&gt;
    for i, bucket in ipairs(buckets) do&lt;br /&gt;
    	s = s + (odds[bucket.name] * bucket.score)&lt;br /&gt;
    end&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local attRolls = {}&lt;br /&gt;
local roundScores = {}&lt;br /&gt;
for attRoll = attRollMin, attRollMax, attRollStep do&lt;br /&gt;
	-- 10 shots per round&lt;br /&gt;
	local score = scorePerShot(calcOdds(attRoll)) * 10&lt;br /&gt;
	table.insert(attRolls, attRoll)&lt;br /&gt;
	table.insert(roundScores, score)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local data = {&lt;br /&gt;
	type = &amp;#039;line&amp;#039;,&lt;br /&gt;
	data = {&lt;br /&gt;
		datasets = {&lt;br /&gt;
			{&lt;br /&gt;
				label = &amp;#039;Score&amp;#039;,&lt;br /&gt;
				fill = false,&lt;br /&gt;
				borderColor = &amp;#039;rgb(255, 0, 0)&amp;#039;,&lt;br /&gt;
				data = helper.convertToXYFormat(roundScores, attRolls)&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	options = {&lt;br /&gt;
		maintainAspectRatio = false,&lt;br /&gt;
		title = {&lt;br /&gt;
			display = true,&lt;br /&gt;
			text = &amp;#039;Average score per round&amp;#039;,&lt;br /&gt;
			font = {&lt;br /&gt;
				size = 18&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		tooltips = {&lt;br /&gt;
			mode = &amp;#039;x&amp;#039;,&lt;br /&gt;
			position = &amp;#039;nearest&amp;#039;,&lt;br /&gt;
			intersect = false&lt;br /&gt;
		},&lt;br /&gt;
		elements = {&lt;br /&gt;
			point = {&lt;br /&gt;
				radius = 0&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		scales = {&lt;br /&gt;
			x = {&lt;br /&gt;
				type = &amp;#039;linear&amp;#039;,&lt;br /&gt;
				min = attRollMin,&lt;br /&gt;
				max = attRollMax,&lt;br /&gt;
				scaleLabel = {&lt;br /&gt;
					display = true,&lt;br /&gt;
					labelString = &amp;#039;Ranged attack roll&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			y = {&lt;br /&gt;
				scaleLabel = {&lt;br /&gt;
					display = true,&lt;br /&gt;
					labelString = &amp;#039;Score&amp;#039;&lt;br /&gt;
				},&lt;br /&gt;
			    ticks = {&lt;br /&gt;
					format = &amp;#039;decimal&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return data&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>