diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index e41bd344..8a369081 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -38,4 +38,4 @@ jobs:
                   mv cargo-nextest /home/runner/.cargo/bin
 
             - name: run the tests
-              run: cargo nextest run
+              run: cargo nextest run -E 'not test(images::icons::tests::soulsy_pack_complete)'
diff --git a/layouts/icon-pack-soulsy/ammo_arrow.svg b/layouts/icon-pack-soulsy/ammo_arrow.svg
index 8ead7448..2a4f1583 100644
--- a/layouts/icon-pack-soulsy/ammo_arrow.svg
+++ b/layouts/icon-pack-soulsy/ammo_arrow.svg
@@ -1,12 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg width="100%" height="100%" viewBox="0 0 510 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
-    <g transform="matrix(1,0,0,1,-75.0387,-71.9196)">
-        <g transform="matrix(0.484862,0,0,0.484862,38.6553,37.0485)">
-            <path d="M963.47,488.37L1016.91,497.065C1020.58,497.675 1024.2,495.69 1025.65,492.261C1034.88,470.581 1070.18,393.097 1122.31,340.201C1125.05,337.451 1125.71,333.251 1123.95,329.791C1122.19,326.33 1118.41,324.392 1114.57,324.99C1041.07,336.123 957.702,319.084 934.712,313.834C931.087,312.994 927.356,314.748 925.688,318.076L901.336,366.428C900.161,368.725 900.141,371.444 901.286,373.752C902.434,376.065 904.61,377.694 907.149,378.147C955.571,386.725 963.282,411.663 963.282,411.663C963.282,411.663 979.009,432.616 957.493,476.819C956.38,479.123 956.419,481.815 957.594,484.088C958.77,486.362 960.946,487.948 963.469,488.373L963.47,488.37Z" style="fill:white;fill-rule:nonzero;"/>
-            <path d="M878.23,427.55L292.01,726.28C286.991,728.839 281.397,730.05 275.768,729.796L187.104,726.046C180.901,725.815 174.792,727.643 169.737,731.249L81.284,793.382C78.319,795.464 76.229,798.569 75.417,802.096C74.6,805.624 75.116,809.331 76.866,812.502C78.616,815.674 81.475,818.088 84.893,819.28L110.979,828.42C116.483,830.346 121.034,834.319 123.682,839.514C126.331,844.71 126.878,850.725 125.206,856.311L117.19,882.795C116.167,886.248 116.444,889.959 117.975,893.221C119.506,896.483 122.182,899.069 125.495,900.487C128.807,901.905 132.522,902.057 135.94,900.913L238.27,865.944C244.133,863.924 249.172,860.038 252.614,854.882L301.669,780.913C304.786,776.233 309.055,772.428 314.067,769.874L502.037,674.085L396.497,888.285C394.001,893.332 390.247,897.648 385.599,900.824L312.287,950.84C307.166,954.336 303.341,959.43 301.412,965.324L267.756,1068.09C266.631,1071.54 266.818,1075.27 268.275,1078.59C269.736,1081.91 272.365,1084.57 275.666,1086.06C278.963,1087.56 282.697,1087.79 286.154,1086.7L312.521,1078.43C318.091,1076.66 324.126,1077.12 329.369,1079.7C334.611,1082.28 338.65,1086.79 340.646,1092.28L350.021,1118.25C351.271,1121.64 353.724,1124.46 356.915,1126.16C360.107,1127.86 363.814,1128.33 367.329,1127.47C370.841,1126.61 373.919,1124.49 375.966,1121.51L437.044,1032.26C440.56,1027.15 442.275,1021.01 441.919,1014.82L436.997,926.203C436.693,920.586 437.841,914.984 440.325,909.937L575.045,636.867L900.455,471.097C908.076,467.035 912.994,459.257 913.393,450.632C913.792,442.003 909.612,433.808 902.397,429.062C895.182,424.316 886.002,423.722 878.237,427.504L878.23,427.55Z" style="fill:white;fill-rule:nonzero;"/>
-            <path d="M815.62,74.742C763.401,127.64 686.39,163.804 664.82,173.39C661.402,174.886 659.461,178.534 660.132,182.202L669.507,235.499C669.945,238.05 671.57,240.238 673.886,241.39C676.203,242.546 678.929,242.523 681.226,241.335C725.148,219.233 746.312,234.679 746.312,234.679C746.312,234.679 771.437,242.085 780.648,290.367C781.121,292.891 782.765,295.043 785.074,296.164C787.383,297.289 790.09,297.25 792.367,296.063L840.367,271.079C843.683,269.368 845.394,265.61 844.515,261.985C838.961,239.087 820.82,155.935 831.015,82.285C831.625,78.398 829.629,74.57 826.097,72.836C822.566,71.105 818.316,71.875 815.617,74.738L815.62,74.742Z" style="fill:white;fill-rule:nonzero;"/>
-            <path d="M598.5,517.97L636,498.892C642.344,495.669 647.473,490.482 650.625,484.103L731.086,320.953C734.043,315.184 734.656,308.492 732.797,302.281C730.934,296.07 726.746,290.82 721.102,287.625C715.262,284.508 708.407,283.895 702.106,285.926C695.805,287.961 690.598,292.465 687.68,298.406L585.66,505.196C583.855,508.876 584.597,513.297 587.504,516.188C590.41,519.078 594.832,519.793 598.504,517.969L598.5,517.97Z" style="fill:white;fill-rule:nonzero;"/>
-        </g>
+<svg width="100%" height="100%" viewBox="0 0 121 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <g transform="matrix(0.709377,0,0,0.709377,0,0)">
+        <path d="M169.54,244.91L84.78,0L0,244.91L45,218L58.8,178.19L51.9,248.42L64.31,256.9L64.13,338.65C64.13,339.16 64.13,339.65 64.19,340.15C64.25,340.65 64.25,341.07 64.31,341.52C64.403,342.341 64.543,343.155 64.73,343.96C65.168,345.912 65.868,347.795 66.81,349.56C67.487,350.893 68.305,352.15 69.25,353.31C72.988,358.042 78.68,360.828 84.71,360.88C93.41,360.88 100.89,354.98 103.88,346.68C104.412,345.193 104.791,343.655 105.01,342.09C105.1,341.47 105.18,340.84 105.21,340.21C105.24,339.58 105.21,339.21 105.21,338.65L105.21,256.9L117.63,248.42L110.73,178.19L124.52,218L169.54,244.91ZM84.78,46.3L91.71,241.83L77.85,241.83L84.78,46.3ZM55.25,128.82C51.42,140.15 47.52,151.45 43.31,162.65C39.1,173.85 34.77,185 29.9,196C32.58,184.28 35.79,172.75 39.2,161.28C42.61,149.81 46.2,138.42 49.98,127.06C53.76,115.7 57.74,104.43 61.92,93.22C66.1,82.01 70.46,70.87 75.34,59.87C72.65,71.6 69.43,83.12 66,94.6C62.57,106.08 59,117.46 55.25,128.82ZM101.45,347.67C95.21,349.94 85.69,352.23 71.71,353.2C70.651,352.085 69.74,350.838 69,349.49C86.24,348.55 96.89,345.56 103.05,343C102.702,344.614 102.165,346.182 101.45,347.67ZM103.45,337.39C96.66,340.15 85.17,343.16 66.69,343.94C66.359,342.681 66.162,341.39 66.1,340.09C85.44,339.32 97.04,336.03 103.45,333.32L103.45,337.39ZM103.45,327.89C96.57,330.67 84.9,333.74 66.02,334.46L66.02,330.56C85.42,329.85 97.02,326.56 103.45,323.79L103.45,327.89ZM103.45,318.39C96.55,321.17 84.88,324.24 66,325L66,321.11C85.4,320.38 97,317.11 103.43,314.32L103.45,318.39ZM103.45,308.86C96.57,311.64 84.9,314.72 66.02,315.43L66.02,311.57C85.42,310.82 97.02,307.5 103.45,304.76L103.45,308.86ZM103.45,299.37C96.57,302.14 84.9,305.21 66.02,305.93L66.02,302.06C85.42,301.31 97.02,298 103.45,295.25L103.45,299.37ZM103.45,289.83C96.57,292.61 84.9,295.68 66.02,296.4L66.02,292.51C85.42,291.79 97.02,288.51 103.45,285.73L103.45,289.83ZM103.45,280.34C96.57,283.11 84.9,286.18 66.02,286.9L66.02,283C85.42,282.27 97.02,279 103.45,276.21L103.45,280.34ZM103.26,94.6C99.89,83.12 96.64,71.6 93.95,59.88C98.84,70.88 103.18,82.02 107.37,93.23C111.56,104.44 115.45,115.73 119.31,127.07C123.17,138.41 126.7,149.79 130.09,161.29C133.48,172.79 136.71,184.29 139.4,196.01C134.51,185.01 130.17,173.86 125.98,162.65C121.79,151.44 117.9,140.15 114.04,128.82C110.18,117.49 106.64,106.07 103.26,94.6Z" style="fill:white;fill-rule:nonzero;"/>
     </g>
 </svg>
diff --git a/layouts/icon-pack-soulsy/ammo_arrow_bodkin.svg b/layouts/icon-pack-soulsy/ammo_arrow_bodkin.svg
new file mode 100644
index 00000000..26f53c06
--- /dev/null
+++ b/layouts/icon-pack-soulsy/ammo_arrow_bodkin.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 88 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <g transform="matrix(0.706636,0,0,0.706636,0,0)">
+        <path d="M123.34,321.91L108.14,190.63L89.48,147.91L89.48,71.12L61.67,0L36.28,71.12L36.28,147.91L15.28,197.19L0,320.19L25.22,301.19C26.81,279.36 31.05,254.19 36.28,227.83L36.28,362.28L89.48,362.28L89,227.94C94.14,241.1 100.18,304.29 100.18,304.29L123.34,321.91Z" style="fill:white;fill-rule:nonzero;"/>
+    </g>
+</svg>
diff --git a/layouts/icon-pack-soulsy/ammo_arrow_broadhead.svg b/layouts/icon-pack-soulsy/ammo_arrow_broadhead.svg
new file mode 100644
index 00000000..4ab7d7ab
--- /dev/null
+++ b/layouts/icon-pack-soulsy/ammo_arrow_broadhead.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 121 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <g transform="matrix(0.355556,0,0,0.355556,0,0)">
+        <path d="M170,0L0,449.24L102.79,479.11L102.79,512.34C102.79,521.666 110.464,529.34 119.79,529.34L132.72,529.34L132.72,588C132.742,595.784 139.156,602.176 146.94,602.17L147.68,602.17L147.68,615.55C143.059,618.024 140.154,622.848 140.13,628.09L140.13,629.22C137.645,629.446 135.72,631.555 135.72,634.05C135.72,636.545 137.645,638.654 140.13,638.88L140.13,641.77C137.645,641.996 135.72,644.105 135.72,646.6C135.72,649.095 137.645,651.204 140.13,651.43L140.13,654.32C137.645,654.546 135.72,656.655 135.72,659.15C135.72,661.645 137.645,663.754 140.13,663.98L140.13,666.87C137.645,667.096 135.72,669.205 135.72,671.7C135.72,674.195 137.645,676.304 140.13,676.53L140.13,679.42C137.645,679.646 135.72,681.755 135.72,684.25C135.72,686.745 137.645,688.854 140.13,689.08L140.13,692C137.645,692.226 135.72,694.335 135.72,696.83C135.72,699.325 137.645,701.434 140.13,701.66L140.13,705.88C140.179,713.641 146.579,720 154.34,720L185.79,720C193.57,720 199.978,713.61 200,705.83L200,701.61C202.485,701.384 204.41,699.275 204.41,696.78C204.41,694.285 202.485,692.176 200,691.95L200,689.06C202.485,688.834 204.41,686.725 204.41,684.23C204.41,681.735 202.485,679.626 200,679.4L200,676.51C202.485,676.284 204.41,674.175 204.41,671.68C204.41,669.185 202.485,667.076 200,666.85L200,664C202.485,663.774 204.41,661.665 204.41,659.17C204.41,656.675 202.485,654.566 200,654.34L200,651.45C202.485,651.224 204.41,649.115 204.41,646.62C204.41,644.125 202.485,642.016 200,641.79L200,638.9C202.485,638.674 204.41,636.565 204.41,634.07C204.41,631.575 202.485,629.466 200,629.24L200,628.11C200.002,622.859 197.085,618.02 192.44,615.57L192.44,602.15L193.18,602.15C200.96,602.161 207.377,595.78 207.41,588L207.41,529.32L220.35,529.32C229.676,529.32 237.35,521.646 237.35,512.32L237.35,479.11L340.15,449.24L170,0ZM132.71,416.16L78.45,400.41L132.07,258.66L132.71,258.66L132.71,416.16ZM177.47,178L190.23,211.7L177.47,211.7L177.47,178ZM182.58,602.14L182.58,613.84L157.58,613.84L157.58,602.14L182.58,602.14ZM162.66,177.88L162.66,211.71L149.85,211.71L162.66,177.88ZM207.41,416.16L207.41,258.66L208.01,258.66L261.67,400.41L207.41,416.16Z" style="fill:white;fill-rule:nonzero;"/>
+    </g>
+</svg>
diff --git a/layouts/icon-pack-soulsy/ammo_arrow_hammerhead.svg b/layouts/icon-pack-soulsy/ammo_arrow_hammerhead.svg
new file mode 100644
index 00000000..e6de767c
--- /dev/null
+++ b/layouts/icon-pack-soulsy/ammo_arrow_hammerhead.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 69 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <g transform="matrix(1,0,0,1,0.194249,0)">
+        <g transform="matrix(0.355556,0,0,0.355556,-0.125183,0)">
+            <path d="M193.26,125C192.104,120.896 188.332,118.04 184.068,118.04C183.189,118.04 182.315,118.161 181.47,118.4C172.304,120.935 163.514,124.675 155.33,129.52C145.11,25.66 96.81,0 96.81,0C96.81,0 48.52,25.66 38.3,129.56C30.115,124.716 21.326,120.977 12.16,118.44C11.251,118.161 10.306,118.019 9.356,118.019C4.117,118.019 -0.194,122.33 -0.194,127.569C-0.194,131.54 2.282,135.115 6,136.51L6.29,136.63C16.7,140.77 26.29,146.4 33.72,154C34.72,155 35.6,156.06 36.54,157.1C36.29,166.03 36.29,175.42 36.6,185.33C41.38,336.27 14.31,471.92 14.31,471.92L47.11,471.92L47.11,489.43L36,489.43C23.074,489.446 12.442,500.074 12.42,513L12.42,544.22C12.447,557.138 23.082,567.755 36,567.76L47.14,567.76L47.14,709.15C47.162,715.098 52.052,719.984 58,720L135.69,720C141.625,719.973 146.495,715.085 146.5,709.15L146.5,567.76L157.64,567.76C170.558,567.755 181.193,557.138 181.22,544.22L181.22,513C181.198,500.074 170.566,489.446 157.64,489.43L146.49,489.43L146.49,471.92L179.29,471.92C179.29,471.92 152.22,336.27 157,185.33C157.31,175.42 157.31,166.03 157.06,157.1C157.99,156.1 158.87,154.98 159.88,154C167.36,146.4 176.88,140.77 187.31,136.63L187.64,136.5C192.165,134.688 194.611,129.684 193.26,125ZM131.68,548.66L119.26,548.66L119.26,508.53L131.68,508.53L131.68,548.66ZM103,508.53L103,548.66L90.6,548.66L90.6,508.53L103,508.53ZM61.92,508.53L74.36,508.53L74.36,548.66L61.94,548.66L61.92,508.53ZM31.53,544.22L31.53,513C31.562,510.56 33.56,508.562 36,508.53L45.7,508.53L45.7,548.66L36,548.66C33.563,548.649 31.557,546.657 31.53,544.22ZM162.1,513L162.1,544.22C162.057,546.651 160.061,548.633 157.63,548.66L147.92,548.66L147.92,508.53L157.63,508.53C160.066,508.572 162.058,510.564 162.1,513Z" style="fill:white;fill-rule:nonzero;"/>
+        </g>
+    </g>
+</svg>
diff --git a/layouts/icon-pack-soulsy/ammo_bolt.svg b/layouts/icon-pack-soulsy/ammo_bolt.svg
new file mode 100644
index 00000000..af005b4e
--- /dev/null
+++ b/layouts/icon-pack-soulsy/ammo_bolt.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" height="115.4px" width="115.2px" xmlns="http://www.w3.org/2000/svg">
+  <g transform="matrix(1.0, 0.0, 0.0, 1.0, -6.4, -6.15)">
+    <path d="M99.15 81.45 L118.05 100.35 104.0 98.1 121.6 115.75 115.85 121.55 98.25 103.9 100.4 118.0 81.5 99.1 79.5 85.15 26.1 31.8 23.35 34.55 6.4 6.15 34.6 23.25 31.85 26.0 85.25 79.35 99.15 81.45" fill="#ffffff" fill-rule="evenodd" stroke="none"/>
+  </g>
+</svg>
diff --git a/layouts/icon-pack-soulsy/ammo_dart.svg b/layouts/icon-pack-soulsy/ammo_dart.svg
new file mode 100644
index 00000000..ddf8d841
--- /dev/null
+++ b/layouts/icon-pack-soulsy/ammo_dart.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 257 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <g transform="matrix(1,0,0,1,-121.919,-120)">
+        <g transform="matrix(0.267223,0,0,0.267223,89.3394,87.9332)">
+            <path d="M1074,126C1066,118 1054,118 1046,126L972,200C934,174 882,180 848,212L648,412C614,446 610,498 636,536L472,700L324,682C318,682 312,684 308,688L128,868C122,874 120,882 124,888C126,896 134,900 140,902L258,916L442,732L392,780L466,706C472,700 478,700 486,700L488,700C490,700 490,700 490,702C490,702 492,702 492,704L496,708C496,708 496,710 498,710L500,712L500,714C502,720 500,728 494,734L420,808L468,760L284,944L298,1062C298,1070 304,1076 312,1078L318,1078C324,1078 328,1076 332,1072L512,892C516,888 518,882 518,876L500,728L664,564C680,574 698,580 718,580C744,580 768,570 788,552L988,352C1022,318 1026,266 1000,228L1074,154C1082,146 1082,134 1074,126Z" style="fill:white;fill-rule:nonzero;"/>
+        </g>
+    </g>
+</svg>
diff --git a/src/data/ammo.rs b/src/data/ammo.rs
index 7cca3329..7dce0832 100644
--- a/src/data/ammo.rs
+++ b/src/data/ammo.rs
@@ -39,32 +39,34 @@ impl HasKeywords for AmmoType {
     /// Use OCF keywords to identify this ammunition type and map it to
     /// one of the enum variants.
     fn classify(_name: &str, keywords: Vec<String>, _ignored: bool) -> Self {
-        let color = super::color::color_from_keywords(&keywords);
+        let color = super::color::color_from_keywords(&keywords).clone();
 
-        let ammo_keywords: Vec<AmmoType> = keywords
+        let ammo_kinds: Vec<AmmoType> = keywords
             .iter()
             .filter_map(|xs| match xs.as_str() {
-                "ArrowBodkin" => Some(Self::BodkinArrow(color.clone())),
-                "ArrowBroadhead" => Some(Self::BroadheadArrow(color.clone())),
-                "ArrowHammer" => Some(Self::HammerheadArrow(color.clone())),
-                "ArrowCrescent" => Some(Self::CrescentArrow(color.clone())),
-                "ArrowFire" => Some(Self::FireArrow(color.clone())),
-                "ArrowWhistle" => Some(Self::WhistleArrow(color.clone())),
-                "ArrowPractice" => Some(Self::PracticeArrow(color.clone())),
-                "OCF_AmmoTypeArrow" => Some(Self::Arrow(color.clone())),
-                "OCF_AmmoTypeBolt" => Some(Self::Bolt(color.clone())),
-                "OCF_AmmoTypeBullet" => Some(Self::Bullet(color.clone())),
-                "OCF_AmmoTypeDart" => Some(Self::Dart(color.clone())),
-                "OCF_AmmoTypeSlingshot" => Some(Self::Slingshot(color.clone())),
-                "OCF_WeapTypeMelee" => Some(Self::Melee(color.clone())),
-                "WAF_WeapTypeGrenade" => Some(Self::Grenade(color.clone())),
+                "ArrowBodkin" => Some(Self::BodkinArrow(color.clone().unwrap_or_default())),
+                "ArrowBroadhead" => Some(Self::BroadheadArrow(color.clone().unwrap_or_default())),
+                "ArrowHammer" => Some(Self::HammerheadArrow(color.clone().unwrap_or_default())),
+                "ArrowCrescent" => Some(Self::CrescentArrow(color.clone().unwrap_or_default())),
+                "ArrowFire" => Some(Self::FireArrow(
+                    color.clone().unwrap_or_else(|| InvColor::Fire),
+                )),
+                "ArrowWhistle" => Some(Self::WhistleArrow(color.clone().unwrap_or_default())),
+                "ArrowPractice" => Some(Self::PracticeArrow(color.clone().unwrap_or_default())),
+                "OCF_AmmoTypeArrow" => Some(Self::Arrow(color.clone().unwrap_or_default())),
+                "OCF_AmmoTypeBolt" => Some(Self::Bolt(color.clone().unwrap_or_default())),
+                "OCF_AmmoTypeBullet" => Some(Self::Bullet(color.clone().unwrap_or_default())),
+                "OCF_AmmoTypeDart" => Some(Self::Dart(color.clone().unwrap_or_default())),
+                "OCF_AmmoTypeSlingshot" => Some(Self::Slingshot(color.clone().unwrap_or_default())),
+                "OCF_WeapTypeMelee" => Some(Self::Melee(color.clone().unwrap_or_default())),
+                "WAF_WeapTypeGrenade" => Some(Self::Grenade(color.clone().unwrap_or_default())),
                 _ => None,
             })
             .collect();
-        if let Some(keyword) = ammo_keywords.first() {
-            keyword.clone()
+        if let Some(ammo) = ammo_kinds.first() {
+            ammo.clone()
         } else {
-            Self::Arrow(color)
+            Self::Arrow(color.unwrap_or_default())
         }
     }
 }
@@ -95,13 +97,13 @@ impl HasIcon for AmmoType {
             AmmoType::Bolt(_) => &Icon::AmmoBolt,
             AmmoType::Dart(_) => &Icon::AmmoDart,
             AmmoType::Slingshot(_) => &Icon::AmmoSlingshot,
-            AmmoType::BodkinArrow(_) => &Icon::AmmoBodkinArrow,
-            AmmoType::BroadheadArrow(_) => &Icon::AmmoBroadheadArrow,
-            AmmoType::HammerheadArrow(_) => &Icon::AmmoHammerheadArrow,
-            AmmoType::CrescentArrow(_) => &Icon::AmmoCrescentArrow,
-            AmmoType::FireArrow(_) => &Icon::AmmoFireArrow,
-            AmmoType::WhistleArrow(_) => &Icon::AmmoWhistleArrow,
-            AmmoType::PracticeArrow(_) => &Icon::AmmoPracticeArrow,
+            AmmoType::BodkinArrow(_) => &Icon::AmmoArrowBodkin,
+            AmmoType::BroadheadArrow(_) => &Icon::AmmoArrowBroadhead,
+            AmmoType::HammerheadArrow(_) => &Icon::AmmoArrowHammerhead,
+            AmmoType::CrescentArrow(_) => &Icon::AmmoArrowCrescent,
+            AmmoType::FireArrow(_) => &Icon::AmmoArrowFire,
+            AmmoType::WhistleArrow(_) => &Icon::AmmoArrowWhistle,
+            AmmoType::PracticeArrow(_) => &Icon::AmmoArrowPractice,
             _ => &Icon::AmmoArrow,
         }
     }
diff --git a/src/data/armor.rs b/src/data/armor.rs
index 796d0a1a..05458c36 100644
--- a/src/data/armor.rs
+++ b/src/data/armor.rs
@@ -37,7 +37,7 @@ impl HasIcon for ArmorType {
 impl HasKeywords for ArmorType {
     fn classify(name: &str, keywords: Vec<String>, _twohanded: bool) -> Self {
         // log::debug!("ARMOR KWDS: {keywords:?}");
-        let color = super::color::color_from_keywords(&keywords);
+        let color = super::color::color_from_keywords(&keywords).unwrap_or_default();
         let tagset: EnumSet<ArmorTag> = strings_to_enumset(&keywords);
 
         let weight = if !WEIGHT_LIGHT.is_disjoint(tagset) {
diff --git a/src/data/base.rs b/src/data/base.rs
index ae5df049..6ddebd71 100644
--- a/src/data/base.rs
+++ b/src/data/base.rs
@@ -302,7 +302,7 @@ mod tests {
             "OCF_AccessoryBelt".to_string(),
             "Armor".to_string(),
         ];
-        assert_eq!(color_from_keywords(&input), InvColor::Fire);
+        assert_eq!(color_from_keywords(&input), Some(InvColor::Fire));
 
         let input = vec![
             "Ammo".to_string(),
@@ -316,7 +316,7 @@ mod tests {
             .filter_map(|xs| InvColor::try_from(xs.as_str()).ok())
             .collect();
         assert_eq!(1, color_keywords.len());
-        assert_eq!(color_from_keywords(&input), InvColor::Water);
+        assert_eq!(color_from_keywords(&input), Some(InvColor::Water));
     }
 
     #[test]
diff --git a/src/data/color.rs b/src/data/color.rs
index 6b69978f..e7d5cb0c 100644
--- a/src/data/color.rs
+++ b/src/data/color.rs
@@ -64,15 +64,15 @@ pub enum InvColor {
     Yellow,
 }
 
-pub fn color_from_keywords(keywords: &[String]) -> InvColor {
+pub fn color_from_keywords(keywords: &[String]) -> Option<InvColor> {
     let color_keywords: Vec<InvColor> = keywords
         .iter()
         .filter_map(|xs| InvColor::try_from(xs.as_str()).ok())
         .collect();
     if let Some(c) = color_keywords.first() {
-        c.clone()
+        Some(c.clone())
     } else {
-        InvColor::default()
+        None
     }
 }
 
diff --git a/src/data/food.rs b/src/data/food.rs
index e5faf382..e7cf93d9 100644
--- a/src/data/food.rs
+++ b/src/data/food.rs
@@ -30,7 +30,7 @@ impl HasIcon for FoodType {
 /// We select color and icon from keywords, so we implement this trait.
 impl HasKeywords for FoodType {
     fn classify(name: &str, keywords: Vec<String>, _twohanded: bool) -> Self {
-        let color = super::color::color_from_keywords(&keywords);
+        let color = super::color::color_from_keywords(&keywords).unwrap_or_default();
         let tags = strings_to_enumset::<FoodKeywords>(&keywords);
         let containers = strings_to_enumset::<ContainerKeywords>(&keywords);
 
diff --git a/src/data/weapon.rs b/src/data/weapon.rs
index e9edd6cf..d2815562 100644
--- a/src/data/weapon.rs
+++ b/src/data/weapon.rs
@@ -81,7 +81,7 @@ impl WeaponType {
 impl HasKeywords for WeaponType {
     fn classify(name: &str, keywords: Vec<String>, twohanded: bool) -> Self {
         // log::debug!("WEAPON KWDS: {keywords:?}");
-        let color = super::color_from_keywords(&keywords);
+        let color = super::color_from_keywords(&keywords).unwrap_or_default();
         let tagset: EnumSet<WeaponTag> = strings_to_enumset(&keywords);
 
         // TODO This is not good enough.
diff --git a/src/images/icons.rs b/src/images/icons.rs
index ab582dac..b375bff1 100644
--- a/src/images/icons.rs
+++ b/src/images/icons.rs
@@ -16,17 +16,17 @@ use strum::{Display, EnumString, EnumVariantNames};
 pub enum Icon {
     Alteration,
     AmmoArrow,
+    AmmoArrowBodkin,
+    AmmoArrowBroadhead,
+    AmmoArrowCrescent,
+    AmmoArrowFire,
+    AmmoArrowHammerhead,
+    AmmoArrowPractice,
+    AmmoArrowWhistle,
     AmmoBolt,
     AmmoBullet,
     AmmoDart,
     AmmoSlingshot,
-    AmmoBodkinArrow,
-    AmmoBroadheadArrow,
-    AmmoHammerheadArrow,
-    AmmoCrescentArrow,
-    AmmoFireArrow,
-    AmmoWhistleArrow,
-    AmmoPracticeArrow,
     ArmorAmulet,
     ArmorBackpack,
     ArmorBelt,
@@ -223,13 +223,13 @@ impl Icon {
             Icon::AmmoBolt => Icon::AmmoArrow,
             Icon::AmmoDart => Icon::AmmoArrow,
             Icon::AmmoSlingshot => Icon::AmmoArrow,
-            Icon::AmmoBodkinArrow => Icon::AmmoArrow,
-            Icon::AmmoBroadheadArrow => Icon::AmmoArrow,
-            Icon::AmmoHammerheadArrow => Icon::AmmoArrow,
-            Icon::AmmoCrescentArrow => Icon::AmmoArrow,
-            Icon::AmmoFireArrow => Icon::AmmoArrow,
-            Icon::AmmoWhistleArrow => Icon::AmmoArrow,
-            Icon::AmmoPracticeArrow => Icon::AmmoArrow,
+            Icon::AmmoArrowBodkin => Icon::AmmoArrow,
+            Icon::AmmoArrowBroadhead => Icon::AmmoArrow,
+            Icon::AmmoArrowHammerhead => Icon::AmmoArrow,
+            Icon::AmmoArrowCrescent => Icon::AmmoArrow,
+            Icon::AmmoArrowFire => Icon::AmmoArrow,
+            Icon::AmmoArrowWhistle => Icon::AmmoArrow,
+            Icon::AmmoArrowPractice => Icon::AmmoArrow,
 
             // All armor becomes the heavy armor icon.
             Icon::ArmorAmulet => Icon::ArmorHeavy,