Add Senate simulator
This commit is contained in:
parent
951c2f6f29
commit
7ad89768e1
7 changed files with 371 additions and 288 deletions
|
@ -4,7 +4,7 @@
|
|||
height="593"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
sodipodi:docname="SenateMap2024.svg"
|
||||
sodipodi:docname="Senate2024.svg"
|
||||
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
|
@ -22,12 +22,12 @@
|
|||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="1"
|
||||
inkscape:deskcolor="#505050"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="461.74073"
|
||||
inkscape:cy="331.63308"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1018"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:zoom="1.569697"
|
||||
inkscape:cx="625.91697"
|
||||
inkscape:cy="365.67566"
|
||||
inkscape:window-width="1858"
|
||||
inkscape:window-height="1058"
|
||||
inkscape:window-x="54"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
|
@ -40,7 +40,7 @@
|
|||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>2024 US presidential election results</dc:title>
|
||||
<dc:title>2020 US presidential election results</dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
|
@ -222,18 +222,9 @@
|
|||
font-family="Helvetica Neue"
|
||||
font-weight="bold">
|
||||
<g
|
||||
font-size="28"
|
||||
id="g1">
|
||||
<text
|
||||
id="AKn"
|
||||
x="121.59544"
|
||||
y="493.18863"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan41"
|
||||
x="121.59544"
|
||||
y="493.18863"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
font-size="28px"
|
||||
id="g1"
|
||||
transform="translate(0.90094684,3.6037874)">
|
||||
<text
|
||||
id="HIn"
|
||||
x="281.26047"
|
||||
|
@ -249,136 +240,71 @@
|
|||
x="117.53755"
|
||||
y="49.386745"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan38"
|
||||
x="117.53755"
|
||||
y="49.386745"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">WA</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan39"
|
||||
x="117.53755"
|
||||
y="66.053368"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
<text
|
||||
id="ORn"
|
||||
x="95.010078"
|
||||
y="122.48579"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan37"
|
||||
x="95.010078"
|
||||
y="122.48579"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
y="49.386745"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">WA</tspan></text>
|
||||
<text
|
||||
id="CAn"
|
||||
x="69.726158"
|
||||
y="279.08011"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan34"
|
||||
x="69.726158"
|
||||
y="279.08011"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">CA</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan35"
|
||||
x="69.726158"
|
||||
y="295.74673"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
y="279.08011"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">CA</tspan></text>
|
||||
<text
|
||||
id="NVn"
|
||||
x="133.35632"
|
||||
y="232.08958"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan32"
|
||||
x="133.35632"
|
||||
y="232.08958"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">NV</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan33"
|
||||
x="133.35632"
|
||||
y="248.75621"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
y="232.08958"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">NV</tspan></text>
|
||||
<text
|
||||
id="AZn"
|
||||
x="188.30663"
|
||||
y="358.99054"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan27"
|
||||
x="188.30663"
|
||||
y="358.99054"
|
||||
style="font-size:13.3333px;fill:#ffffff">AZ</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan28"
|
||||
x="188.30663"
|
||||
y="375.65717"
|
||||
style="font-size:13.3333px;fill:#ffffff" /></text>
|
||||
y="358.99054"
|
||||
style="font-size:13.3333px;fill:#ffffff">AZ</tspan></text>
|
||||
<text
|
||||
id="UTn"
|
||||
x="219.70537"
|
||||
y="251.48579"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan25"
|
||||
x="219.70537"
|
||||
y="251.48579"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">UT</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan26"
|
||||
x="219.70537"
|
||||
y="268.1524"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
<text
|
||||
id="IDn"
|
||||
x="194.15645"
|
||||
y="151.80695"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
x="194.15645"
|
||||
y="151.80695"
|
||||
id="tspan22"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
y="251.48579"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">UT</tspan></text>
|
||||
<text
|
||||
id="MTn"
|
||||
x="279.21573"
|
||||
y="85.347488"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan15"
|
||||
x="279.21573"
|
||||
y="85.347488"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">MT</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan16"
|
||||
x="279.21573"
|
||||
y="102.01411"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
y="85.347488"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">MT</tspan></text>
|
||||
<text
|
||||
id="WYn"
|
||||
x="298.39981"
|
||||
y="182.08109"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan18"
|
||||
x="298.39981"
|
||||
y="182.08109"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">WY</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="298.39981"
|
||||
y="198.74771"
|
||||
id="tspan19"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
<text
|
||||
id="COn"
|
||||
x="319.78827"
|
||||
y="270.08292"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan24"
|
||||
x="319.78827"
|
||||
y="270.08292"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">WY</tspan></text>
|
||||
<text
|
||||
id="NMn"
|
||||
x="302.97266"
|
||||
|
@ -399,24 +325,6 @@
|
|||
x="415.85614"
|
||||
y="451.69336"
|
||||
style="font-size:13.3333px;fill:#ffffff;fill-opacity:1">TX</tspan></text>
|
||||
<text
|
||||
id="OKn"
|
||||
x="461.73621"
|
||||
y="358.28769"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan6"
|
||||
x="461.73621"
|
||||
y="358.28769" /></text>
|
||||
<text
|
||||
id="KSn"
|
||||
x="441.22095"
|
||||
y="289.62161"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan8"
|
||||
x="441.22095"
|
||||
y="289.62161" /></text>
|
||||
<text
|
||||
id="NEn"
|
||||
x="414.12476"
|
||||
|
@ -427,16 +335,6 @@
|
|||
x="414.12476"
|
||||
y="221.48842"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">NE</tspan></text>
|
||||
<text
|
||||
id="SDn"
|
||||
x="415.85419"
|
||||
y="157.25868"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan12"
|
||||
x="415.85419"
|
||||
y="157.25868"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
<text
|
||||
id="NDn"
|
||||
x="417.25748"
|
||||
|
@ -467,26 +365,6 @@
|
|||
x="579.54468"
|
||||
y="159.84668"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">WI</tspan></text>
|
||||
<text
|
||||
id="ILn"
|
||||
x="596.69891"
|
||||
y="249.73816"
|
||||
style="font-size:13.3333px;fill:#ffffff"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan74"
|
||||
x="596.69891"
|
||||
y="249.73816"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
<text
|
||||
id="IAn"
|
||||
x="521.78705"
|
||||
y="212.28769"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan44"
|
||||
x="521.78705"
|
||||
y="212.28769"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
<text
|
||||
id="MOn"
|
||||
x="540.95941"
|
||||
|
@ -497,26 +375,6 @@
|
|||
x="540.95941"
|
||||
y="292.93628"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">MO</tspan></text>
|
||||
<text
|
||||
id="ARn"
|
||||
x="547.24762"
|
||||
y="374.0896"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan52"
|
||||
x="547.24762"
|
||||
y="374.0896"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
<text
|
||||
id="LAn"
|
||||
x="545.79749"
|
||||
y="450.64859"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan54"
|
||||
x="545.79749"
|
||||
y="450.64859"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
<text
|
||||
id="MSn"
|
||||
x="597.98846"
|
||||
|
@ -527,60 +385,16 @@
|
|||
x="597.98846"
|
||||
y="417.18863"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">MS</tspan></text>
|
||||
<text
|
||||
id="ALn"
|
||||
x="650.66272"
|
||||
y="409.38675"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan58"
|
||||
x="650.66272"
|
||||
y="409.38675"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
<text
|
||||
id="GAn"
|
||||
x="714.30121"
|
||||
y="407.73816"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan50"
|
||||
x="714.30121"
|
||||
y="407.73816"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
<text
|
||||
id="FLn"
|
||||
x="763.43597"
|
||||
y="504.54953"
|
||||
x="763.88647"
|
||||
y="510.85617"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan55"
|
||||
x="763.43597"
|
||||
y="504.54953"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#f8f8f8;fill-opacity:1">FL</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan56"
|
||||
x="763.43597"
|
||||
y="521.21613"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#f8f8f8;fill-opacity:1" /></text>
|
||||
<text
|
||||
id="SCn"
|
||||
x="759.23254"
|
||||
y="347.11545"><tspan
|
||||
sodipodi:role="line"
|
||||
x="759.23254"
|
||||
y="347.11545"
|
||||
id="tspan61"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
<text
|
||||
id="NCn"
|
||||
x="781.7052"
|
||||
y="328.48581"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan68"
|
||||
x="781.7052"
|
||||
y="328.48581"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
x="763.88647"
|
||||
y="510.85617"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#f8f8f8;fill-opacity:1">FL</tspan></text>
|
||||
<text
|
||||
id="TNn"
|
||||
x="655.9707"
|
||||
|
@ -591,16 +405,6 @@
|
|||
x="655.9707"
|
||||
y="340.83722"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">TN</tspan></text>
|
||||
<text
|
||||
id="KYn"
|
||||
x="675.10925"
|
||||
y="299.28769"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan70"
|
||||
x="675.10925"
|
||||
y="299.28769"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
<text
|
||||
id="INn"
|
||||
x="644.74738"
|
||||
|
@ -626,16 +430,11 @@
|
|||
x="700.31543"
|
||||
y="235.38675"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan81"
|
||||
x="700.31543"
|
||||
y="235.38675"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">OH</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan82"
|
||||
x="700.31543"
|
||||
y="252.05338"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1" /></text>
|
||||
y="235.38675"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">OH</tspan></text>
|
||||
<text
|
||||
id="WVn"
|
||||
x="738.71716"
|
||||
|
@ -661,16 +460,11 @@
|
|||
x="779.22137"
|
||||
y="210.08958"
|
||||
style="font-size:13.3333px"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan87"
|
||||
x="779.22137"
|
||||
y="210.08958"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">PA</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan88"
|
||||
x="779.22137"
|
||||
y="226.75621"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff" /></text>
|
||||
y="210.08958"
|
||||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff">PA</tspan></text>
|
||||
<text
|
||||
id="NYn"
|
||||
x="811.52887"
|
||||
|
@ -683,50 +477,28 @@
|
|||
style="font-size:13.3333px;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">NY</tspan></text>
|
||||
<text
|
||||
id="MEn"
|
||||
x="901.54358"
|
||||
y="94.712509"
|
||||
x="893.28827"
|
||||
y="89.306831"
|
||||
style="font-size:16px"><tspan
|
||||
style="fill:#ffffff"
|
||||
id="tspan101" /></text>
|
||||
<text
|
||||
id="MEn-9"
|
||||
x="882.96747"
|
||||
y="89.878593"
|
||||
style="font-size:14.7521px;stroke-width:0.52686"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan5"
|
||||
x="882.96747"
|
||||
y="89.878593"
|
||||
style="fill:#ffffff;stroke-width:0.52686">ME</tspan></text>
|
||||
<text
|
||||
id="MEn-9-7"
|
||||
x="877.93567"
|
||||
y="111.5111"
|
||||
style="font-size:14.7521px;stroke-width:0.52686"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4-0"
|
||||
x="877.93567"
|
||||
y="111.5111"
|
||||
style="fill:#ffffff;stroke-width:0.52686" /><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan5-9"
|
||||
x="877.93567"
|
||||
y="129.95123"
|
||||
style="fill:#ffffff;stroke-width:0.52686" /></text>
|
||||
id="tspan4"
|
||||
x="893.28827"
|
||||
y="89.306831"
|
||||
style="text-align:center;text-anchor:middle;fill:#ffffff">ME</tspan></text>
|
||||
<text
|
||||
id="MEn-9-0"
|
||||
x="459.24854"
|
||||
y="239.60818"
|
||||
x="461.50092"
|
||||
y="235.77916"
|
||||
style="font-size:14.7521px;stroke-width:0.52686"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4-6"
|
||||
x="459.24854"
|
||||
y="239.60818"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.52686">II</tspan><tspan
|
||||
x="461.50092"
|
||||
y="235.77916"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.52686">S</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan5-2"
|
||||
x="459.24854"
|
||||
y="258.04831"
|
||||
x="461.50092"
|
||||
y="254.21928"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.52686" /></text>
|
||||
<text
|
||||
id="DemL"
|
||||
|
@ -740,17 +512,10 @@
|
|||
<g
|
||||
font-size="22"
|
||||
id="g2">
|
||||
<text
|
||||
id="NHn"
|
||||
x="817.56848"
|
||||
y="56.648579"
|
||||
style="font-size:16px"><tspan
|
||||
style="font-size:16px;fill:#ffffff"
|
||||
id="tspan92" /></text>
|
||||
<text
|
||||
id="VTn"
|
||||
x="818.22137"
|
||||
y="81.230995"
|
||||
x="818.83032"
|
||||
y="82"
|
||||
style="font-size:16px"><tspan
|
||||
style="fill:#ffffff"
|
||||
id="tspan93">VT</tspan></text>
|
||||
|
@ -802,7 +567,7 @@
|
|||
y="327"
|
||||
style="font-size:16px"><tspan
|
||||
style="font-size:16px;fill:#ffffff"
|
||||
id="tspan100" /></text>
|
||||
id="tspan100">DC 3</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<!--
|
||||
|
@ -811,11 +576,11 @@
|
|||
-->
|
||||
<path
|
||||
id="lines"
|
||||
d="m 854.7108,74.76564 -0.002,-5.99e-4 M 832,86 l 8,17 m 49,50 34,3 m -41,22 41,12 m -57,-6 51,33 m -72,13 50,22 m -58,-2 51,26 m -55,-15 46,33 m -79,-43 0.002,7e-5"
|
||||
d="m 832,86 8,17 m 49,50 34,3 m -41,22 41,12 m -57,-6 51,33 m -72,13 50,22 m -58,-2 51,26 m -55,-15 46,33"
|
||||
stroke="#000"
|
||||
stroke-width="1.6"
|
||||
style="stroke:#fdfdfd;stroke-opacity:1"
|
||||
sodipodi:nodetypes="cccccccccccccccccc" />
|
||||
sodipodi:nodetypes="cccccccccccccc" />
|
||||
<path
|
||||
id="frames"
|
||||
d="M215,493v55l36,45 M0,425h147l68,68h85l54,54v46"
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 39 KiB |
|
@ -1,6 +1,7 @@
|
|||
enum VoteType {
|
||||
Electoral,
|
||||
Popular,
|
||||
Senate,
|
||||
}
|
||||
|
||||
export default VoteType;
|
|
@ -9,7 +9,8 @@ export default interface Election {
|
|||
candidates : {
|
||||
name : string,
|
||||
party : string,
|
||||
color : string
|
||||
color : string,
|
||||
startingSeats? : number
|
||||
}[],
|
||||
states : {
|
||||
[key : string] : {
|
||||
|
|
307
src/elections/2024_senate.ts
Normal file
307
src/elections/2024_senate.ts
Normal file
|
@ -0,0 +1,307 @@
|
|||
import { readFile } from "node:fs/promises";
|
||||
import Election from "../election.js";
|
||||
import VoteType from "../VoteType.js";
|
||||
|
||||
const Senate_2024 = {
|
||||
title: "2024 United States Senate Election Simulator",
|
||||
shortname: "2024",
|
||||
description: "The CalubViem Press has called the 2024 United States Senate for $WINNER!",
|
||||
voteType: VoteType.Senate,
|
||||
svg: await readFile("assets/Senate2024.svg", "utf-8"),
|
||||
candidates: [
|
||||
{
|
||||
name: "Democrats",
|
||||
party: "Democratic",
|
||||
color: "#1C408C",
|
||||
startingSeats: 29,
|
||||
},
|
||||
{
|
||||
name: "Republicans",
|
||||
party: "Republican",
|
||||
color: "#BF1D29",
|
||||
startingSeats: 37,
|
||||
},
|
||||
{
|
||||
name: "Independent",
|
||||
party: "Independent",
|
||||
color: "#BFAB22",
|
||||
startingSeats: 0,
|
||||
}
|
||||
],
|
||||
states: {
|
||||
"AZ": {
|
||||
odds: {
|
||||
"Democratic": 0.51,
|
||||
"Republican": 0.48,
|
||||
"Independent": 0.01,
|
||||
},
|
||||
population: 2326300 // using 2018 turnout for all of these
|
||||
},
|
||||
"CA": {
|
||||
odds: {
|
||||
"Democratic": 0.67,
|
||||
"Republican": 0.33,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 11113364
|
||||
},
|
||||
"CT": {
|
||||
odds: {
|
||||
"Democratic": 0.65,
|
||||
"Republican": 0.37,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 1371296
|
||||
},
|
||||
"DE": {
|
||||
odds: {
|
||||
"Democratic": 0.65,
|
||||
"Republican": 0.37,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 354512
|
||||
},
|
||||
"FL": {
|
||||
odds: {
|
||||
"Republican": 0.57,
|
||||
"Democratic": 0.44,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 8188977
|
||||
},
|
||||
"HI": {
|
||||
odds: {
|
||||
"Democratic": 0.70,
|
||||
"Republican": 0.34,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 388351
|
||||
},
|
||||
"IN": {
|
||||
odds: {
|
||||
"Republican": 0.63,
|
||||
"Democratic": 0.39,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 2181553
|
||||
},
|
||||
"ME": {
|
||||
odds: {
|
||||
"Independent": 0.60,
|
||||
"Republican": 0.30,
|
||||
"Democratic": 0.15,
|
||||
},
|
||||
population: 634345
|
||||
},
|
||||
"MD": {
|
||||
odds: {
|
||||
"Democratic": 0.61,
|
||||
"Republican": 0.37,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 2188631
|
||||
},
|
||||
"MA": {
|
||||
odds: {
|
||||
"Democratic": 0.65,
|
||||
"Republican": 0.34,
|
||||
"Independent": 0.01,
|
||||
},
|
||||
population: 2612581
|
||||
},
|
||||
"MI": {
|
||||
odds: {
|
||||
"Democratic": 0.52,
|
||||
"Republican": 0.47,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 4153296
|
||||
},
|
||||
"MN": {
|
||||
odds: {
|
||||
"Democratic": 0.64,
|
||||
"Republican": 0.34,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 2506611
|
||||
},
|
||||
"MS": {
|
||||
odds: {
|
||||
"Republican": 0.60,
|
||||
"Democratic": 0.37,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 917186
|
||||
},
|
||||
"MO": {
|
||||
odds: {
|
||||
"Republican": 0.60,
|
||||
"Democratic": 0.36,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 2367862
|
||||
},
|
||||
"MT": {
|
||||
odds: {
|
||||
"Republican": 0.51,
|
||||
"Democratic": 0.49,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 489839
|
||||
},
|
||||
"NE": {
|
||||
odds: {
|
||||
"Republican": 0.61,
|
||||
"Independent": 0.34,
|
||||
"Democratic": 0.34,
|
||||
},
|
||||
population: 673068
|
||||
},
|
||||
"NE-02": {
|
||||
odds: {
|
||||
"Republican": 0.60,
|
||||
"Democratic": 0.36,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 673068
|
||||
},
|
||||
"NV": {
|
||||
odds: {
|
||||
"Democratic": 0.51,
|
||||
"Republican": 0.48,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 931273
|
||||
},
|
||||
"NJ": {
|
||||
odds: {
|
||||
"Democratic": 0.61,
|
||||
"Republican": 0.30,
|
||||
"Independent": 0.20,
|
||||
},
|
||||
population: 3069009
|
||||
},
|
||||
"NM": {
|
||||
odds: {
|
||||
"Democratic": 0.62,
|
||||
"Republican": 0.37,
|
||||
"Independent": 0.01,
|
||||
},
|
||||
population: 697012
|
||||
},
|
||||
"NY": {
|
||||
odds: {
|
||||
"Democratic": 0.65,
|
||||
"Republican": 0.33,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 6055151
|
||||
},
|
||||
"ND": {
|
||||
odds: {
|
||||
"Republican": 0.61,
|
||||
"Democratic": 0.34,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 324096
|
||||
},
|
||||
"OH": {
|
||||
odds: {
|
||||
"Democratic": 0.54,
|
||||
"Republican": 0.46,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 4409887
|
||||
},
|
||||
"PA": {
|
||||
odds: {
|
||||
"Democratic": 0.52,
|
||||
"Republican": 0.48,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 4927285
|
||||
},
|
||||
"RI": {
|
||||
odds: {
|
||||
"Democratic": 0.62,
|
||||
"Republican": 0.37,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 375898
|
||||
},
|
||||
"TN": {
|
||||
odds: {
|
||||
"Republican": 0.62,
|
||||
"Democratic": 0.37,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 2212933
|
||||
},
|
||||
"TX": {
|
||||
odds: {
|
||||
"Republican": 0.59,
|
||||
"Democratic": 0.41,
|
||||
"Independent": 0.01,
|
||||
},
|
||||
population: 8306185
|
||||
},
|
||||
"UT": {
|
||||
odds: {
|
||||
"Republican": 0.64,
|
||||
"Democratic": 0.31,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 993756
|
||||
},
|
||||
"VT": {
|
||||
odds: {
|
||||
"Independent": 0.70,
|
||||
"Republican": 0.25,
|
||||
"Democratic": 0,
|
||||
},
|
||||
population: 258464
|
||||
},
|
||||
"VA": {
|
||||
odds: {
|
||||
"Democratic": 0.58,
|
||||
"Republican": 0.40,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 3284683
|
||||
},
|
||||
"WA": {
|
||||
odds: {
|
||||
"Democratic": 0.60,
|
||||
"Republican": 0.38,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 3086168
|
||||
},
|
||||
"WV": {
|
||||
odds: {
|
||||
"Republican": 0.62,
|
||||
"Democratic": 0.33,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 561623
|
||||
},
|
||||
"WI": {
|
||||
odds: {
|
||||
"Democratic": 0.55,
|
||||
"Republican": 0.46,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 2657799
|
||||
},
|
||||
"WY": {
|
||||
odds: {
|
||||
"Republican": 0.75,
|
||||
"Democratic": 0.2,
|
||||
"Independent": 0,
|
||||
},
|
||||
population: 197437
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export default Senate_2024 as Election;
|
|
@ -7,6 +7,7 @@ import Presidential_1940 from "./1940.js";
|
|||
import Presidential_1968 from "./1968.js";
|
||||
import Presidential_1992 from "./1992.js";
|
||||
import Presidential_2024 from "./2024.js";
|
||||
import Senate_2024 from "./2024_senate.js";
|
||||
import NK_2019 from "./NK2019.js";
|
||||
import ROC_2024 from "./ROC2024.js";
|
||||
|
||||
|
@ -25,6 +26,7 @@ const Elections = {
|
|||
"2008": Presidential_2008,
|
||||
*/
|
||||
"2024": Presidential_2024,
|
||||
"senate_2024": Senate_2024,
|
||||
// Other
|
||||
"nk2019": NK_2019,
|
||||
"roc2024": ROC_2024,
|
||||
|
|
|
@ -165,7 +165,7 @@ if (!config.token) {
|
|||
.addFields(result.candidates.map(c => {
|
||||
return {
|
||||
name: `${(result.winner === c.name ? ":white_check_mark:" : "")} ${c.name} (${c.party})`,
|
||||
value: `${election.voteType === VoteType.Electoral ? `${c.electoralVotes} electoral votes\n` : ""}${c.votes.toLocaleString()} votes (${((c.votes / result.totalVotes) * 100).toFixed(2)}%)`,
|
||||
value: `${election.voteType === VoteType.Electoral ? `${c.electoralVotes} electoral votes\n` : ""}${election.voteType === VoteType.Senate ? `${c.seats} seats\n` : ""}${c.votes.toLocaleString()} votes (${((c.votes / result.totalVotes) * 100).toFixed(2)}%)`,
|
||||
inline: true
|
||||
}
|
||||
}))
|
||||
|
|
|
@ -19,6 +19,7 @@ export function MakePrediction(election : Election, overlay_image?: string, over
|
|||
party: candidate.party,
|
||||
votes: 0,
|
||||
electoralVotes: 0,
|
||||
seats: candidate.startingSeats,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -32,6 +33,9 @@ export function MakePrediction(election : Election, overlay_image?: string, over
|
|||
if (election.voteType === VoteType.Electoral) {
|
||||
pred.candidates.find((c : any) => c.party === winner).electoralVotes += election.states[state].electoralVotes;
|
||||
}
|
||||
if (election.voteType === VoteType.Senate) {
|
||||
pred.candidates.find((c : any) => c.party === winner).seats += 1;
|
||||
}
|
||||
for (const candidate of election.candidates) {
|
||||
pred.candidates.find((c : any) => c.party === candidate.party).votes += votes[candidate.party];
|
||||
}
|
||||
|
@ -74,6 +78,8 @@ export function MakePrediction(election : Election, overlay_image?: string, over
|
|||
pred.winner = pred.candidates.sort((a : any, b : any) => b.electoralVotes - a.electoralVotes)[0].name;
|
||||
else if (election.voteType === VoteType.Popular)
|
||||
pred.winner = pred.candidates.sort((a : any, b : any) => b.votes - a.votes)[0].name;
|
||||
else if (election.voteType === VoteType.Senate)
|
||||
pred.winner = pred.candidates.sort((a : any, b : any) => b.seats - a.seats)[0].name;
|
||||
pred.totalVotes = pred.candidates.reduce((a : any, b : any) => a + b.votes, 0);
|
||||
pred.svg = draw.svg();
|
||||
pred.png = png;
|
||||
|
@ -87,6 +93,7 @@ export interface Prediction {
|
|||
name : string,
|
||||
party : string,
|
||||
electoralVotes : number,
|
||||
seats : number,
|
||||
votes : number,
|
||||
}[],
|
||||
winner: string,
|
||||
|
|
Loading…
Reference in a new issue