{"id":2059,"date":"2026-09-07T13:35:02","date_gmt":"2026-09-07T17:35:02","guid":{"rendered":"https:\/\/miniquasar.com\/?post_type=product&#038;p=2059"},"modified":"2026-09-14T16:31:43","modified_gmt":"2026-09-14T20:31:43","slug":"the-plagueborne-plague-carriers","status":"publish","type":"product","link":"https:\/\/miniquasar.com\/us\/product\/the-plagueborne-plague-carriers\/","title":{"rendered":"The Plagueborne \u2013 Plague Carriers"},"content":{"rendered":"<div class=\"tmq-below\">\n<div class=\"tmq-story\">\n<section>\n      <span class=\"label\">The full story<\/span><\/p>\n<h2>The Plagueborne \u2013 Plague Carriers<\/h2>\n<p>Victims of Norminos, these undead plague carriers are those slain and reanimated by the dark servant of Idinhelieth and Myrothlir. They act to his command, and are most commonly used to sow dissent and panic into the forces that would stand against him, for even a warrior that may best them in battle will lose to the ailment they gain from their fight.<\/p>\n<p>The Plagueborne are victims of Norminos who have been reanimated against their will, set upon by festering ailments and pestilence. Their undeath is excruciating, moreso than any of the other concoctions heralded by Myrothlir. The Plagueborne are conscious, but passengers within their own minds, their will dictated by the hand of Norminos who sets them against other mortals, slaying them and in turn proliferating his army of Plagueborne.<\/p>\n<p>When a Plagueborne is slain, some claim you may hear whispers of thanks or relief as their souls are finally hewed from their puppeteered and decaying corpse. Yet in the current chaos that is engulfing Syelden, for each Plagueborne slain, two more take its place. They are pouring in through portals from Nosmarka\u2019s Abyss, and without a stop to it, they will completely overrun and destroy the afterlife and its sanctity.<\/p>\n<\/section>\n<div class=\"tmq-reveal-head\"><span class=\"kicker\">The set<\/span><\/p>\n<p>The dark forces of Mindoriel\u2019s Spawn have invaded Syelden, the Endless End. Tharador\u2019s afterlife of infinite planes, each tailored to the souls that reside there. The Tharameni and their devout protectors must fend off the evil of Idinhelieth, the harbinger of disease and pestilence, before his rot corrupts even the most pure of places. Should they fail, the afterlife would become a torturous hell for all.<\/p>\n<\/div>\n<figure class=\"tmq-reveal\"><a class=\"tmq-reveal-card\" href=\"https:\/\/miniquasar.com\/campaigns\/hell-at-heavens-gate\/\"><span class=\"tmq-reveal-frame\"><img fetchpriority=\"high\" decoding=\"async\" class=\"tmq-reveal-a\" loading=\"eager\" width=\"420\" height=\"420\" src=\"https:\/\/miniquasar.com\/wp-content\/uploads\/2026\/09\/hell-gate-release-tmq.png\" alt=\"Hell at Heaven's Gate set\"><img decoding=\"async\" class=\"tmq-reveal-b\" loading=\"eager\" width=\"420\" height=\"420\" src=\"https:\/\/miniquasar.com\/wp-content\/uploads\/2026\/09\/hell-gate-set-minis.png\" alt=\"Hell at Heaven's Gate miniatures\"><\/span><\/a><\/figure>\n<div class=\"tmq-reveal-head\"><span class=\"kicker\">The campaign<\/span><\/p>\n<p>In Divine Gambit Pt III the party awakes in the blackness of the void, after having suffered an untimely end. They discover, however, that the sanctuary of heaven has been breached by the forces of evil, who are slowly destroying the fabric of the afterlife. They must band together with other survivors to drive the forces of the abyss out, restoring order to Syelden and the infinite planes that exist within it.<\/p>\n<\/div>\n<figure class=\"tmq-reveal\"><a class=\"tmq-reveal-card\" href=\"https:\/\/miniquasar.com\/campaigns\/hell-at-heavens-gate\/\"><span class=\"tmq-reveal-frame\"><img decoding=\"async\" class=\"tmq-reveal-a\" loading=\"eager\" width=\"420\" height=\"420\" src=\"https:\/\/miniquasar.com\/wp-content\/uploads\/2026\/09\/hell-gate-campaign-cover.png\" alt=\"Hell at Heaven's Gate campaign\"><img decoding=\"async\" class=\"tmq-reveal-b\" loading=\"eager\" width=\"420\" height=\"420\" src=\"https:\/\/miniquasar.com\/wp-content\/uploads\/2026\/09\/hell-open-book.png\" alt=\"Hell at Heaven's Gate campaign book\"><\/span><\/a><\/figure>\n<figure class=\"tmq-size-guide\">\n      <img decoding=\"async\" src=\"https:\/\/miniquasar.com\/wp-content\/uploads\/2026\/08\/size-guide-tmq.png\" alt=\"Size guide \u2014 32mm tabletop and 75mm display\"><br \/>\n    <\/figure>\n<\/p><\/div>\n<aside class=\"tmq-details\">\n    <span class=\"label\">Details<\/span><\/p>\n<h3>Painting<\/h3>\n<p>We specialize in custom painted miniatures, so if you are interested in painted minis, please send us a message and we will arrange that for you. All miniatures sold are unpainted, unless otherwise specified. If you would like us to add free matte black primer to the prints, you can let us know, and they&#8217;ll be ready to paint right out of the box!<\/p>\n<h3>Shipping<\/h3>\n<p>Our models are shipped assembled if they are not too delicate, but are usually separated from the base. Wings and some other parts may also be detached and need to be put together, especially for larger models. To put the pieces together, you could use epoxy putty, super glue, or any strong glue that works for plastics. This is to ensure that none of the delicate pieces break or get damaged during shipping. If you really need pieces glued together, please let us know and we will do our best to accommodate.<\/p>\n<h3>Free Miniature<\/h3>\n<p>Get a free miniature with your order. No requirements, every order gets one. It will be a random character from our store. If you order multiple minis, you may even get more than one for free! Enjoy.<\/p>\n<h3>Model Scale<\/h3>\n<p>Normal-sized miniatures come in two sizes: 32mm and 75mm, which is the height of the humanoid body, so with the base and other accessories like hats, they will end up being a little taller. 32mm is the standard size if you are playing D&amp;D on a physical battle map.<\/p>\n<p>Larger miniatures are measured by the diameter of their base. Large-sized miniatures usually have a 50mm base, huge-sized ones have a 75mm base, gargantuan ones have a 100-120mm base. For specific measurements on any model, please contact us and we&#8217;ll be happy to give you the exact numbers.<\/p>\n<h3>Creation of Miniatures<\/h3>\n<p>These models are made by the fantastic people at DM Stash, and they make incredible models, so please check them out. We are officially licensed to print and sell their models to you, so you can enjoy them too! We print them with an Elegoo Saturn 4 Ultra resin printer with 16K resolution (the highest quality available). They are printed using Elegoo Standard 3.0 Vanilla coloured resin, an expensive resin that ensures models are strong without compromising on the detail. The supports are cut off, the model is sanded if needed, and inspected to ensure perfection. The model is washed off with pure alcohol, then cured inside an Elegoo ultcuring enclosure, and prepared for printing.<\/p>\n<\/aside>\n<\/div>\n<p><script>\njQuery(function ($) {\n  function tmqCartBounce() {\n    var $el = $(\".header-cart-wrap, .tmq-header-cart\").first();\n    if (!$el.length) {\n      return;\n    }\n    $el.removeClass(\"tmq-cart-bounce\");\n    if ($el[0]) {\n      $el[0].offsetWidth;\n    }\n    $el.addClass(\"tmq-cart-bounce\");\n    window.setTimeout(function () {\n      $el.removeClass(\"tmq-cart-bounce\");\n    }, 700);\n  }\n  if (window.sessionStorage) {\n    if (sessionStorage.getItem(\"tmqCartBounce\") === \"1\") {\n      sessionStorage.removeItem(\"tmqCartBounce\");\n      window.setTimeout(tmqCartBounce, 80);\n    }\n  }\n  $(document.body).on(\"added_to_cart\", function () {\n    if (window.sessionStorage) {\n      sessionStorage.setItem(\"tmqCartBounce\", \"1\");\n    }\n    tmqCartBounce();\n  });\n  var $sum = $(\"div.product .summary\");\n  function tmqMoney(prices) {\n    var raw, minor, n, prefix;\n    if (!prices) {\n      return \"\";\n    }\n    raw = prices.price;\n    minor = prices.currency_minor_unit;\n    if (typeof minor === \"undefined\") {\n      minor = 2;\n    }\n    n = Number(raw);\n    if (isNaN(n)) {\n      return \"\";\n    }\n    prefix = prices.currency_prefix;\n    if (!prefix) {\n      prefix = \"$\";\n    }\n    return prefix + (n \/ Math.pow(10, minor)).toFixed(2);\n  }\n  function tmqVarName(v) {\n    var i, a, attrs, text, idx;\n    attrs = v.attributes;\n    if (attrs) {\n      if (attrs.length) {\n        for (i = 0; i !== attrs.length; i++) {\n          a = attrs[i];\n          if (a.value) {\n            return a.value;\n          }\n          if (a.option) {\n            return a.option;\n          }\n        }\n      }\n    }\n    text = v.variation || \"\";\n    idx = text.lastIndexOf(\": \");\n    if (idx !== -1) {\n      return text.substring(idx + 2);\n    }\n    if (text) {\n      return text;\n    }\n    return \"\";\n  }\n  function tmqBlob(im) {\n    return ((im.name || \"\") + \" \" + (im.src || \"\") + \" \" + (im.thumbnail || \"\") + \" \" + (im.alt || \"\")).toLowerCase();\n  }\n  function tmqIsGuide(im) {\n    var s = tmqBlob(im);\n    if (s.indexOf(\"size-guide\") !== -1) {\n      return true;\n    }\n    if (s.indexOf(\"size_guide\") !== -1) {\n      return true;\n    }\n    if (s.indexOf(\"size guide\") !== -1) {\n      return true;\n    }\n    return false;\n  }\n  function tmqIsPack(im) {\n    var s = tmqBlob(im);\n    if (s.indexOf(\"pack-set\") !== -1) {\n      return true;\n    }\n    if (s.indexOf(\"pack_set\") !== -1) {\n      return true;\n    }\n    return false;\n  }\n  function tmqPickThumbs(imgs) {\n    var i, im, others, show;\n    others = [];\n    for (i = 0; i !== imgs.length; i++) {\n      im = imgs[i];\n      if (tmqIsGuide(im)) {\n        continue;\n      }\n      if (tmqIsPack(im)) {\n        continue;\n      }\n      others.push(im);\n    }\n    if (others.length > 4) {\n      return others;\n    }\n    show = [];\n    for (i = 0; i !== imgs.length; i++) {\n      im = imgs[i];\n      if (tmqIsGuide(im)) {\n        continue;\n      }\n      if (imgs.length > 6) {\n        if (i === 6) {\n          continue;\n        }\n      }\n      show.push(im);\n    }\n    return show;\n  }\n  function tmqRenderSizes($p, vars) {\n    var i, v, label, price, $rows, $row, $price, $link, list;\n    if (!vars) {\n      return;\n    }\n    if (!vars.length) {\n      return;\n    }\n    if ($p.find(\".tmq-size-rows\").length) {\n      return;\n    }\n    list = vars.slice().sort(function (a, b) {\n      var na = tmqVarName(a);\n      var nb = tmqVarName(b);\n      if (nb > na) {\n        return -1;\n      }\n      if (na > nb) {\n        return 1;\n      }\n      return 0;\n    });\n    $rows = $(document.createElement(\"div\")).addClass(\"tmq-size-rows\");\n    for (i = 0; i !== list.length; i++) {\n      v = list[i];\n      label = tmqVarName(v);\n      price = tmqMoney(v.prices);\n      if (!label) {\n        if (!price) {\n          continue;\n        }\n      }\n      $row = $(document.createElement(\"div\")).addClass(\"tmq-size-row\");\n      if (label) {\n        $row.append($(document.createElement(\"span\")).addClass(\"tmq-size-label\").text(label));\n      }\n      if (price) {\n        $row.append(document.createTextNode(\" \"));\n        $row.append($(document.createElement(\"span\")).addClass(\"tmq-size-amt\").text(price));\n      }\n      $rows.append($row);\n    }\n    if (!$rows.children().length) {\n      return;\n    }\n    $price = $p.find(\".price\").first();\n    $link = $p.find(\"a.woocommerce-LoopProduct-link\").first();\n    if ($price.length) {\n      $price.addClass(\"tmq-price-hide\");\n      $price.hide();\n      $price.after($rows);\n    } else {\n      if ($link.length) {\n        $link.after($rows);\n      } else {\n        $p.append($rows);\n      }\n    }\n  }\n  function tmqRenderThumbs($p, imgs) {\n    var i, im, show, $img, $photo, $thumbs, $t, thumb, full, origSrc, origSrcset;\n    if (!imgs) {\n      return;\n    }\n    if (!imgs.length) {\n      return;\n    }\n    if ($p.find(\".tmq-card-thumbs\").length) {\n      return;\n    }\n    show = tmqPickThumbs(imgs);\n    if (!show.length) {\n      return;\n    }\n    $img = $p.find(\"img\").first();\n    if (!$img.length) {\n      return;\n    }\n    origSrc = $img.attr(\"src\");\n    origSrcset = $img.attr(\"srcset\") || \"\";\n    $p.data(\"tmq-orig-src\", origSrc);\n    $p.data(\"tmq-orig-srcset\", origSrcset);\n    if (!$img.parent().hasClass(\"tmq-card-photo\")) {\n      $img.wrap($(document.createElement(\"span\")).addClass(\"tmq-card-photo\"));\n    }\n    $photo = $img.parent();\n    $thumbs = $(document.createElement(\"span\")).addClass(\"tmq-card-thumbs\");\n    for (i = 0; i !== show.length; i++) {\n      im = show[i];\n      thumb = im.thumbnail;\n      if (!thumb) {\n        thumb = im.src;\n      }\n      full = im.src;\n      if (!full) {\n        full = thumb;\n      }\n      if (!thumb) {\n        continue;\n      }\n      $t = $(document.createElement(\"img\"));\n      $t.attr(\"src\", thumb);\n      $t.attr(\"data-full\", full);\n      $t.attr(\"alt\", im.alt || im.name || \"\");\n      $thumbs.append($t);\n    }\n    $photo.append($thumbs);\n    $thumbs.on(\"click\", \"img\", function (e) {\n      var next = $(this).attr(\"data-full\");\n      e.preventDefault();\n      e.stopPropagation();\n      if (next) {\n        $img.attr(\"src\", next);\n        $img.removeAttr(\"srcset\");\n        $img.removeAttr(\"sizes\");\n      }\n      return false;\n    });\n    $p.on(\"mouseleave\", function () {\n      var src = $p.data(\"tmq-orig-src\");\n      var srcset = $p.data(\"tmq-orig-srcset\");\n      if (src) {\n        $img.attr(\"src\", src);\n      }\n      if (srcset) {\n        $img.attr(\"srcset\", srcset);\n      }\n    });\n  }\n  function tmqEnhanceCard($p) {\n    var cls, m, id;\n    if ($p.data(\"tmq-ready\")) {\n      return;\n    }\n    $p.data(\"tmq-ready\", 1);\n    cls = $p.attr(\"class\") || \"\";\n    m = cls.match(\/post-(\\d+)\/);\n    if (!m) {\n      return;\n    }\n    id = m[1];\n    $.getJSON(\"https:\/\/miniquasar.com\/wp-json\/wc\/store\/v1\/products\/\" + id, function (data) {\n      var vars;\n      if (!data) {\n        return;\n      }\n      tmqRenderThumbs($p, data.images || []);\n      vars = data.variations;\n      if (!vars) {\n        return;\n      }\n      if (!vars.length) {\n        return;\n      }\n      if (vars[0].prices) {\n        tmqRenderSizes($p, vars);\n        return;\n      }\n      $.getJSON(\n        \"https:\/\/miniquasar.com\/wp-json\/wc\/store\/v1\/products\",\n        { type: \"variation\", parent: id },\n        function (list) {\n          tmqRenderSizes($p, list);\n        }\n      );\n    });\n  }\n  function tmqPackIndividuals($form, variations, $sizeSel, $modelSel) {\n    var $sec, $grid, $art, $img, $h3, $btns, $btn, $gal, $host, $found, $slugFront, $slugHit, $wordFront, $wordHit, sizeOpts, si, sizeVal, sizeLabel, modelVal, modelLabel, slug, lastWord, src, alt, blob, found, price, priceText, i, a, k, hit, pid, vid, url, payload, attrs, idAttr, m, $b;\n    if ($(\".tmq-individuals\").length) {\n      return;\n    }\n    sizeOpts = [];\n    $sizeSel.find(\"option\").each(function () {\n      if (this.value) {\n        sizeOpts.push({ val: this.value, text: this.text || this.value });\n      }\n    });\n    sizeOpts.sort(function (a, b) {\n      var ra, rb, ta, tb;\n      ta = (a.text || \"\").toLowerCase();\n      tb = (b.text || \"\").toLowerCase();\n      ra = 2;\n      rb = 2;\n      if (ta.indexOf(\"32\") !== -1) {\n        ra = 0;\n      } else {\n        if (ta.indexOf(\"75\") !== -1) {\n          ra = 1;\n        }\n      }\n      if (tb.indexOf(\"32\") !== -1) {\n        rb = 0;\n      } else {\n        if (tb.indexOf(\"75\") !== -1) {\n          rb = 1;\n        }\n      }\n      return ra - rb;\n    });\n    $sec = $(document.createElement(\"div\")).addClass(\"tmq-individuals\");\n    $sec.append($(document.createElement(\"span\")).addClass(\"label\").text(\"Get individual miniatures from this set\"));\n    $grid = $(document.createElement(\"div\")).addClass(\"tmq-individuals-grid\");\n    $sec.append($grid);\n    $gal = $(\".woocommerce-product-gallery img\");\n    $modelSel.find(\"option\").each(function () {\n      if (!this.value) {\n        return;\n      }\n      modelVal = this.value;\n      modelLabel = (this.text || modelVal).replace(\/^Choose an option\/i, \"\").trim();\n      if (modelLabel.toLowerCase().indexOf(\"full set\") !== -1) {\n        return;\n      }\n      $art = $(document.createElement(\"article\")).addClass(\"tmq-ind\").attr(\"data-model\", modelVal);\n      slug = modelLabel.toLowerCase().replace(\/\\s+\/g, \"-\");\n      lastWord = modelLabel.toLowerCase().replace(\/^.*\\s\/, \"\");\n      $slugFront = $();\n      $slugHit = $();\n      $wordFront = $();\n      $wordHit = $();\n      $gal.each(function () {\n        var $im = $(this);\n        src = (($im.attr(\"src\") || \"\") + \" \" + ($im.attr(\"data-src\") || \"\") + \" \" + ($im.attr(\"data-large_image\") || \"\")).toLowerCase();\n        alt = ($im.attr(\"alt\") || \"\").toLowerCase();\n        blob = src + \" \" + alt;\n        if (blob.indexOf(slug) !== -1) {\n          if (!$slugHit.length) {\n            $slugHit = $im;\n          }\n          if (src.indexOf(\"-front\") !== -1) {\n            if (!$slugFront.length) {\n              $slugFront = $im;\n            }\n          }\n        }\n        if (lastWord) {\n          if (blob.indexOf(lastWord) !== -1) {\n            if (!$wordHit.length) {\n              $wordHit = $im;\n            }\n            if (src.indexOf(\"-front\") !== -1) {\n              if (!$wordFront.length) {\n                $wordFront = $im;\n              }\n            }\n          }\n        }\n      });\n      $found = $();\n      if ($slugFront.length) {\n        $found = $slugFront;\n      } else {\n        if ($slugHit.length) {\n          $found = $slugHit;\n        } else {\n          if ($wordFront.length) {\n            $found = $wordFront;\n          } else {\n            if ($wordHit.length) {\n              $found = $wordHit;\n            } else {\n              $found = $gal.first();\n            }\n          }\n        }\n      }\n      $img = $(document.createElement(\"img\")).attr(\"alt\", modelLabel);\n      src = \"\";\n      if ($found.length) {\n        src = $found.attr(\"data-large_image\") || \"\";\n        if (!src) {\n          src = $found.attr(\"data-src\") || \"\";\n        }\n        if (!src) {\n          src = $found.attr(\"src\") || \"\";\n        }\n      }\n      if (src) {\n        $img.attr(\"src\", src);\n        $art.append($img);\n      }\n      $h3 = $(document.createElement(\"h3\")).text(modelLabel);\n      $art.append($h3);\n      $btns = $(document.createElement(\"div\")).addClass(\"tmq-ind-btns\");\n      for (si = 0; si !== sizeOpts.length; si++) {\n        sizeVal = sizeOpts[si].val;\n        sizeLabel = (sizeOpts[si].text || sizeVal).replace(\/^Choose an option\/i, \"\").trim();\n        found = null;\n        for (i = 0; i !== variations.length; i++) {\n          a = variations[i].attributes || {};\n          hit = 0;\n          for (k in a) {\n            if (a[k] === sizeVal) {\n              hit = hit + 1;\n            }\n            if (a[k] === modelVal) {\n              hit = hit + 1;\n            }\n          }\n          if (hit > 1) {\n            found = variations[i];\n          }\n        }\n        if (!found) {\n          continue;\n        }\n        price = \"\";\n        if (found.display_price != null) {\n          price = found.display_price;\n        }\n        priceText = \"\";\n        if (price !== \"\") {\n          priceText = \"$\" + Number(price).toFixed(2);\n        }\n        $btn = $(document.createElement(\"button\")).attr(\"type\", \"button\").addClass(\"tmq-ind-btn\");\n        $btn.attr(\"data-size\", sizeVal);\n        $btn.attr(\"data-model\", modelVal);\n        $btn.attr(\"data-variation\", found.variation_id);\n        $btn.append($(document.createElement(\"span\")).addClass(\"tmq-ind-size\").text(sizeLabel));\n        if (priceText) {\n          $btn.append($(document.createElement(\"span\")).addClass(\"tmq-ind-price\").text(priceText));\n        }\n        $btn.append($(document.createElement(\"span\")).addClass(\"tmq-ind-add\").text(\"Add to cart\"));\n        $btns.append($btn);\n      }\n      $art.append($btns);\n      $grid.append($art);\n    });\n    if (!$grid.children().length) {\n      return;\n    }\n    $host = $(\"div.product .summary\").first();\n    if ($host.length) {\n      $host.after($sec);\n    } else {\n      $host = $(\".woocommerce-product-gallery\").first();\n      if ($host.length) {\n        $host.after($sec);\n      } else {\n        $host = $(\".tmq-below\").first();\n        if ($host.length) {\n          $host.before($sec);\n        }\n      }\n    }\n    $sec.on(\"click\", \".tmq-ind-btn\", function (e) {\n      e.preventDefault();\n      $b = $(this);\n      vid = $b.attr(\"data-variation\");\n      pid = $form.data(\"product_id\");\n      if (!pid) {\n        pid = $form.find(\"input[name=product_id]\").val();\n      }\n      if (!pid) {\n        idAttr = $form.closest(\".product\").attr(\"id\") || \"\";\n        m = String(idAttr).match(\/(\\d+)\/);\n        if (m) {\n          pid = m[1];\n        }\n      }\n      url = \"\/?wc-ajax=add_to_cart\";\n      if (typeof wc_add_to_cart_params !== \"undefined\") {\n        if (wc_add_to_cart_params.wc_ajax_url) {\n          url = wc_add_to_cart_params.wc_ajax_url.replace(\"%%endpoint%%\", \"add_to_cart\");\n        }\n      }\n      if (!vid) {\n        return;\n      }\n      payload = {\n        product_id: vid,\n        variation_id: vid,\n        quantity: 1\n      };\n      if (pid) {\n        payload.parent_id = pid;\n      }\n      found = null;\n      for (i = 0; i !== variations.length; i++) {\n        if (String(variations[i].variation_id) === String(vid)) {\n          found = variations[i];\n        }\n      }\n      if (found) {\n        attrs = found.attributes;\n        if (attrs) {\n          for (k in attrs) {\n            payload[k] = attrs[k];\n            payload[\"variation[\" + k + \"]\"] = attrs[k];\n          }\n        }\n      }\n      $.post(url, payload, function (res) {\n        if (res) {\n          if (res.error) {\n            return;\n          }\n          if (res.fragments) {\n            $.each(res.fragments, function (sel, html) {\n              $(sel).replaceWith(html);\n            });\n          }\n        }\n        if (window.sessionStorage) {\n          sessionStorage.setItem(\"tmqCartBounce\", \"1\");\n        }\n        $(document.body).trigger(\"added_to_cart\");\n      });\n    });\n  }\n  var $form = $(\"form.variations_form\");\n  if ($form.length) {\n    var variations = $form.data(\"product_variations\");\n    if (!variations) {\n      variations = [];\n    }\n    var $sizeSel = $();\n    var $modelSel = $();\n    var grouped = 0;\n    $form.find(\"select\").each(function () {\n      var $s = $(this);\n      var n = ($s.attr(\"name\") || \"\").toLowerCase();\n      if (n.indexOf(\"size\") !== -1) {\n        if (n.indexOf(\"tabletop\") === -1) {\n          $sizeSel = $s;\n        }\n      }\n      if (n.indexOf(\"model\") !== -1) {\n        $modelSel = $s;\n      }\n    });\n    if ($sizeSel.length) {\n      if ($modelSel.length) {\n        grouped = 1;\n      }\n    }\n    if (grouped) {\n      var $box, sizeOpts, modelOpts, setOpts, si, mi, sizeVal, sizeLabel, modelVal, modelLabel, $btn, price, priceText, found, i, a, k, hit, currentSize, currentModel;\n      $sizeSel.addClass(\"tmq-size-native\");\n      $modelSel.addClass(\"tmq-size-native\");\n      $box = $(document.createElement(\"div\")).addClass(\"tmq-size-picks\").attr(\"role\", \"radiogroup\").attr(\"aria-label\", \"Size\");\n      sizeOpts = [];\n      $sizeSel.find(\"option\").each(function () {\n        if (this.value) {\n          sizeOpts.push({ val: this.value, text: this.text || this.value });\n        }\n      });\n      sizeOpts.sort(function (a, b) {\n        var ra, rb, ta, tb;\n        ta = (a.text || \"\").toLowerCase();\n        tb = (b.text || \"\").toLowerCase();\n        ra = 2;\n        rb = 2;\n        if (ta.indexOf(\"32\") !== -1) {\n          ra = 0;\n        } else {\n          if (ta.indexOf(\"75\") !== -1) {\n            ra = 1;\n          }\n        }\n        if (tb.indexOf(\"32\") !== -1) {\n          rb = 0;\n        } else {\n          if (tb.indexOf(\"75\") !== -1) {\n            rb = 1;\n          }\n        }\n        return ra - rb;\n      });\n      modelOpts = [];\n      $modelSel.find(\"option\").each(function () {\n        if (this.value) {\n          modelOpts.push({ val: this.value, text: this.text || this.value });\n        }\n      });\n      setOpts = [];\n      for (mi = 0; mi !== modelOpts.length; mi++) {\n        modelLabel = (modelOpts[mi].text || modelOpts[mi].val).replace(\/^Choose an option\/i, \"\").trim();\n        if (modelLabel.toLowerCase().indexOf(\"full set\") !== -1) {\n          setOpts.push(modelOpts[mi]);\n        }\n      }\n      for (si = 0; si !== sizeOpts.length; si++) {\n        sizeVal = sizeOpts[si].val;\n        sizeLabel = (sizeOpts[si].text || sizeVal).replace(\/^Choose an option\/i, \"\").trim();\n        for (mi = 0; mi !== setOpts.length; mi++) {\n          modelVal = setOpts[mi].val;\n          price = \"\";\n          found = null;\n          for (i = 0; i !== variations.length; i++) {\n            a = variations[i].attributes || {};\n            hit = 0;\n            for (k in a) {\n              if (a[k] === sizeVal) {\n                hit = hit + 1;\n              }\n              if (a[k] === modelVal) {\n                hit = hit + 1;\n              }\n            }\n            if (hit > 1) {\n              found = variations[i];\n            }\n          }\n          if (!found) {\n            continue;\n          }\n          if (found.display_price != null) {\n            price = found.display_price;\n          }\n          priceText = \"\";\n          if (price !== \"\") {\n            priceText = \"$\" + Number(price).toFixed(2);\n          }\n          $btn = $(document.createElement(\"button\")).attr(\"type\", \"button\").addClass(\"tmq-size-pick\").attr(\"role\", \"radio\").attr(\"aria-checked\", \"false\");\n          $btn.attr(\"data-size\", sizeVal);\n          $btn.attr(\"data-model\", modelVal);\n          $btn.append($(document.createElement(\"span\")).addClass(\"tmq-size-name\").text(sizeLabel + \" Full Set\"));\n          if (priceText) {\n            $btn.append($(document.createElement(\"span\")).addClass(\"tmq-size-price\").text(priceText));\n          }\n          $btn.on(\"click\", function () {\n            var sv = $(this).attr(\"data-size\");\n            var mv = $(this).attr(\"data-model\");\n            $box.find(\".tmq-size-pick\").removeClass(\"is-on\").attr(\"aria-checked\", \"false\");\n            $(this).addClass(\"is-on\").attr(\"aria-checked\", \"true\");\n            $sizeSel.val(sv);\n            $sizeSel.trigger(\"change\");\n            $modelSel.val(mv);\n            $modelSel.trigger(\"change\");\n          });\n          $box.append($btn);\n        }\n      }\n      $form.find(\"select\").last().after($box);\n      currentSize = $sizeSel.val();\n      currentModel = $modelSel.val();\n      if (currentSize) {\n        if (currentModel) {\n          $box.find('.tmq-size-pick[data-size=\"' + currentSize + '\"][data-model=\"' + currentModel + '\"]').addClass(\"is-on\").attr(\"aria-checked\", \"true\");\n        } else {\n          $box.find(\".tmq-size-pick\").first().trigger(\"click\");\n        }\n      } else {\n        $box.find(\".tmq-size-pick\").first().trigger(\"click\");\n      }\n      tmqPackIndividuals($form, variations, $sizeSel, $modelSel);\n    } else {\n      $form.find(\"select\").each(function () {\n        var $sel = $(this);\n        var $box, current, usable;\n        usable = $sel.find(\"option[value]\").filter(function () {\n          return this.value;\n        });\n        if (!(usable.length >= 1)) {\n          return;\n        }\n        $sel.addClass(\"tmq-size-native\");\n        $box = $(document.createElement(\"div\")).addClass(\"tmq-size-picks\").attr(\"role\", \"radiogroup\").attr(\"aria-label\", \"Size\");\n        $sel.find(\"option\").each(function () {\n          var val = this.value;\n          var label, price, priceText, $btn, i, a, k;\n          if (!val) {\n            return;\n          }\n          label = (this.text || val).replace(\/^Choose an option\/i, \"\").trim();\n          price = \"\";\n          for (i = 0; i !== variations.length; i++) {\n            a = variations[i].attributes || {};\n            for (k in a) {\n              if (a[k] === val) {\n                if (variations[i].display_price != null) {\n                  price = variations[i].display_price;\n                }\n              }\n            }\n          }\n          priceText = \"\";\n          if (price !== \"\") {\n            priceText = \"$\" + Number(price).toFixed(2);\n          }\n          $btn = $(document.createElement(\"button\")).attr(\"type\", \"button\").addClass(\"tmq-size-pick\").attr(\"role\", \"radio\").attr(\"aria-checked\", \"false\");\n          $btn.attr(\"data-value\", val);\n          $btn.append($(document.createElement(\"span\")).addClass(\"tmq-size-name\").text(label));\n          if (priceText) {\n            $btn.append($(document.createElement(\"span\")).addClass(\"tmq-size-price\").text(priceText));\n          }\n          $btn.on(\"click\", function () {\n            $box.find(\".tmq-size-pick\").removeClass(\"is-on\").attr(\"aria-checked\", \"false\");\n            $(this).addClass(\"is-on\").attr(\"aria-checked\", \"true\");\n            $sel.val(val).trigger(\"change\");\n          });\n          $box.append($btn);\n        });\n        $sel.after($box);\n        current = $sel.val();\n        if (current) {\n          $box.find('[data-value=\"' + current + '\"]').addClass(\"is-on\").attr(\"aria-checked\", \"true\");\n        } else {\n          $box.find(\".tmq-size-pick\").first().trigger(\"click\");\n        }\n      });\n    }\n  }\n  var paintHref = \"https:\/\/miniquasar.com\/contact\/\";\n  var paintHtml = $(document.createElement(\"a\")).addClass(\"tmq-paint-link\").attr(\"href\", paintHref).text(\"Inquire about Painted Miniatures\");\n  var $after;\n  if ($sum.length) {\n    if (!$sum.find(\".tmq-paint-link\").length) {\n      $after = $sum.find(\".tmq-size-picks\").first();\n      if ($after.length) {\n        $after.after(paintHtml);\n      } else {\n        $sum.find(\"form.cart\").before(paintHtml);\n      }\n    }\n  }\n});\n<\/script><\/p>\n<p><script id=\"tmq-plagueborne-image-fix\">\njQuery(function ($) {\n  var correct = \"https:\/\/miniquasar.com\/wp-content\/uploads\/2026\/09\/plagueborne-01-coloured.jpg\";\n  function fix() {\n    $(\".woocommerce-product-gallery__wrapper > div\").each(function (idx) {\n      var $wrap=$(this), $img=$wrap.find(\"img\").first(); if(!$img.length)return;\n      var src=($img.attr(\"src\")||\"\")+\" \"+($wrap.attr(\"data-thumb\")||\"\");\n      if(src.indexOf(\"\/fk0\")!==-1){ if(idx===0){$img.attr({src:correct,\"data-src\":correct,\"data-large_image\":correct});$wrap.attr(\"data-thumb\",correct);$wrap.find(\"a\").first().attr(\"href\",correct);$img.removeAttr(\"srcset\");} else {$wrap.remove();} }\n    });\n  }\n  fix(); setTimeout(fix,500); setTimeout(fix,1500); setTimeout(fix,3000);\n});\n<\/script><\/p>\n<style id=\"tmq-plagueborne-buybox-fix\">\ntable.variations tr:first-child, table.variations th.label, table.variations select { display:none !important; }\n<\/style>\n<style id=\"tmq-plagueborne-fk0-hide\">.woocommerce-product-gallery__wrapper > div[data-thumb*=\"\/fk0\"] { display:none !important; }<\/style>\n","protected":false},"excerpt":{"rendered":"<p>Unpainted 16K resin miniatures. Set of 3. Sizes 32mm and 75mm. Made in Canada.<\/p>\n<p class=\"tmq-chips\"><span>Monster<\/span><span>Undead<\/span><span>Normal<\/span><\/p>\n<div class=\"tmq-set\"><span class=\"label\">Campaign set<\/span><\/p>\n<h3>Hell at Heaven&#8217;s Gate<\/h3>\n<p><a class=\"tmq-set-link\" href=\"https:\/\/miniquasar.com\/campaigns\/hell-at-heavens-gate\/\">View the set<\/a><\/div>\n","protected":false},"featured_media":2068,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"default","_kad_post_title":"","_kad_post_layout":"default","_kad_post_sidebar_id":"","_kad_post_content_style":"default","_kad_post_vertical_padding":"default","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":""},"product_brand":[],"product_cat":[110],"product_tag":[],"class_list":["post-2059","product","type-product","status-publish","has-post-thumbnail","product_cat-hell-at-heavens-gate","pa_gender-other","pa_mini-type-monster","pa_race-undead","pa_set-hell-at-heavens-gate","pa_size-32mm","pa_size-75mm","pa_tabletop-size-normal","first","instock","taxable","shipping-taxable","purchasable","product-type-variable","entry","content-bg","loop-entry"],"_links":{"self":[{"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/product\/2059","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/product"}],"about":[{"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/types\/product"}],"replies":[{"embeddable":true,"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/comments?post=2059"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/media\/2068"}],"wp:attachment":[{"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/media?parent=2059"}],"wp:term":[{"taxonomy":"product_brand","embeddable":true,"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/product_brand?post=2059"},{"taxonomy":"product_cat","embeddable":true,"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/product_cat?post=2059"},{"taxonomy":"product_tag","embeddable":true,"href":"https:\/\/miniquasar.com\/us\/wp-json\/wp\/v2\/product_tag?post=2059"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}