{"id":242,"date":"2026-02-12T13:40:22","date_gmt":"2026-02-12T13:40:22","guid":{"rendered":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/?p=242"},"modified":"2026-02-13T01:50:00","modified_gmt":"2026-02-13T01:50:00","slug":"crafting-materials-calculator","status":"publish","type":"post","link":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/","title":{"rendered":"Materials Calculator &#8211; What Can I Make?"},"content":{"rendered":"\r\n<div id=\"quinfall-materials-tools\" data-json=\"https:\/\/gamingwithdaopa.ellatha.com\/media\/thequinfall\/master_recipes.min.json\">\r\n  <style>\r\n    :root {\r\n      --bg: #0a0a0f;\r\n      --panel: #111116;\r\n      --panel-2: #16161d;\r\n      --ink: #e0e7ff;\r\n      --muted: #a0a8c0;\r\n      --accent: #f59e0b;\r\n      --accent-glow: #fbbf24;\r\n      --grid: #1e1e2e;\r\n      --radius: 12px;\r\n    }\r\n    #quinfall-materials-tools {\r\n      color: var(--ink);\r\n      background: var(--bg);\r\n      padding: 24px;\r\n      border-radius: var(--radius);\r\n      font-family: Arial, Helvetica, sans-serif;\r\n    }\r\n    h1, h2, h3 { color: #fff; margin: 0 0 12px; }\r\n    h1 { font-size: 26px; }\r\n    .lede { color: var(--muted); font-size: 15px; margin: 0 0 24px; text-align: center; }\r\n    .tabs { display: flex; gap: 12px; margin: 20px 0 24px; flex-wrap: wrap; }\r\n    .tab-button {\r\n      padding: 12px 24px;\r\n      background: var(--panel-2);\r\n      border: 1px solid var(--grid);\r\n      color: var(--muted);\r\n      cursor: pointer;\r\n      border-radius: var(--radius);\r\n      transition: all 0.2s;\r\n    }\r\n    .tab-button.active, .tab-button:hover {\r\n      background: rgba(245,158,11,0.15);\r\n      color: var(--accent-glow);\r\n      border-color: var(--accent);\r\n    }\r\n    .toolbar {\r\n      background: var(--panel);\r\n      border: 1px solid var(--grid);\r\n      border-radius: var(--radius);\r\n      padding: 16px;\r\n      margin-bottom: 20px;\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      gap: 12px;\r\n      align-items: center;\r\n    }\r\n    .search-container {\r\n      flex: 1;\r\n      min-width: 240px;\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 10px;\r\n      background: #0d0d18;\r\n      border: 1px solid #25253a;\r\n      border-radius: 10px;\r\n      padding: 8px 12px;\r\n    }\r\n    .search-icon { color: #888; font-size: 18px; }\r\n    .search {\r\n      flex: 1;\r\n      background: transparent;\r\n      border: none;\r\n      color: white;\r\n      font-size: 14px;\r\n      outline: none;\r\n    }\r\n    .search::placeholder { color: var(--muted); }\r\n    select, input[type=\"number\"], input[type=\"text\"] {\r\n      background: #0d0d18;\r\n      border: 1px solid #25253a;\r\n      color: white;\r\n      padding: 8px 12px;\r\n      border-radius: 8px;\r\n      font-size: 14px;\r\n    }\r\n    button {\r\n      background: rgba(245,158,11,0.2);\r\n      border: 1px solid var(--accent);\r\n      color: var(--accent-glow);\r\n      padding: 10px 18px;\r\n      border-radius: 8px;\r\n      cursor: pointer;\r\n      transition: all 0.2s;\r\n    }\r\n    button:hover { background: rgba(245,158,11,0.35); }\r\n    .partial-toggle {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 10px;\r\n      font-size: 14px;\r\n      color: var(--muted);\r\n      margin: 16px 0;\r\n    }\r\n    .material-grid {\r\n      display: grid;\r\n      grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\r\n      gap: 14px;\r\n    }\r\n    .material-card {\r\n      background: var(--panel-2);\r\n      border: 1px solid var(--grid);\r\n      border-radius: var(--radius);\r\n      padding: 14px;\r\n      cursor: pointer;\r\n      transition: all 0.2s;\r\n    }\r\n    .material-card:hover {\r\n      background: rgba(245,158,11,0.09);\r\n      border-color: var(--accent);\r\n    }\r\n    .material-card strong { color: #fff; display: block; margin-bottom: 6px; }\r\n    .stats-row { display: flex; gap: 16px; flex-wrap: wrap; font-size: 13px; color: var(--muted); }\r\n    .stats-row span { background: #0e0e1c; padding: 4px 10px; border-radius: 6px; }\r\n    .modal-overlay {\r\n      position: fixed; inset: 0;\r\n      background: rgba(0,0,0,0.75);\r\n      display: flex; align-items: center; justify-content: center;\r\n      z-index: 9999;\r\n    }\r\n    .modal {\r\n      background: var(--panel);\r\n      border: 1px solid var(--grid);\r\n      border-radius: var(--radius);\r\n      width: 90%; max-width: 680px;\r\n      max-height: 85vh; overflow-y: auto;\r\n      padding: 24px; position: relative;\r\n    }\r\n    .close {\r\n      position: absolute; top: 16px; right: 20px;\r\n      font-size: 32px; color: var(--muted); cursor: pointer;\r\n    }\r\n    .close:hover { color: var(--accent); }\r\n    .modal-header {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      margin-bottom: 16px;\r\n      padding-bottom: 12px;\r\n      border-bottom: 1px solid var(--grid);\r\n    }\r\n    .back-link {\r\n      color: var(--accent-glow);\r\n      cursor: pointer;\r\n      font-size: 14px;\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 6px;\r\n    }\r\n    .back-link:hover { text-decoration: underline; }\r\n    .recipe-detail-grid {\r\n      display: grid;\r\n      grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\r\n      gap: 12px;\r\n      margin: 20px 0;\r\n    }\r\n    .detail-box {\r\n      background: #0e0e1c;\r\n      border: 1px solid #252540;\r\n      border-radius: 8px;\r\n      padding: 12px;\r\n      text-align: center;\r\n    }\r\n    .detail-label { font-size: 12px; color: var(--muted); }\r\n    .detail-value { font-size: 18px; font-weight: bold; color: var(--accent-glow); }\r\n    .ingredients-grid {\r\n      display: grid;\r\n      grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\r\n      gap: 10px;\r\n      margin-top: 16px;\r\n    }\r\n    .ing-item {\r\n      background: #0f0f1b;\r\n      border: 1px solid #2a2a40;\r\n      border-radius: 8px;\r\n      padding: 10px;\r\n      display: flex;\r\n      justify-content: space-between;\r\n      font-size: 14px;\r\n    }\r\n    .ing-qty { color: var(--accent); font-weight: bold; }\r\n    .recipe-list-item {\r\n      padding: 10px 12px;\r\n      border-bottom: 1px solid var(--grid);\r\n      cursor: pointer;\r\n      transition: all 0.15s;\r\n    }\r\n    .recipe-list-item:hover {\r\n      background: rgba(245,158,11,0.08);\r\n    }\r\n    .recipe-list-item strong { color: #fff; }\r\n    table {\r\n      width: 100%;\r\n      border-collapse: separate;\r\n      border-spacing: 0;\r\n      font-size: 14px;\r\n      margin-bottom: 24px;\r\n      background: var(--panel-2);\r\n      border: 1px solid var(--grid);\r\n      border-radius: 8px;\r\n      overflow: hidden;\r\n      box-shadow: 0 2px 8px rgba(0,0,0,0.3);\r\n    }\r\n    th, td {\r\n      padding: 12px 14px;\r\n      text-align: left;\r\n      border-bottom: 1px solid var(--grid);\r\n      border-right: 1px solid var(--grid);\r\n    }\r\n    th:last-child, td:last-child {\r\n      border-right: none;\r\n    }\r\n    th {\r\n      background: #0e0e1c;\r\n      color: var(--accent-glow);\r\n      font-weight: 600;\r\n      position: sticky;\r\n      top: 0;\r\n      z-index: 1;\r\n    }\r\n    tbody tr:last-child td {\r\n      border-bottom: 1px solid var(--grid) !important;\r\n    }\r\n    tbody tr:hover {\r\n      background: rgba(245,158,11,0.06);\r\n    }\r\n    #inventory-table {\r\n      table-layout: fixed;\r\n    }\r\n    #inventory-table col:nth-child(1) { width: 65%; }\r\n    #inventory-table col:nth-child(2) { width: 20%; }\r\n    #inventory-table col:nth-child(3) { width: 15%; text-align: center; }\r\n    #inventory-table tbody {\r\n      min-height: 80px;\r\n    }\r\n    .craftable {\r\n      background: rgba(39,174,96,0.12);\r\n      border-left: 4px solid #27ae60;\r\n      padding: 16px;\r\n      margin: 0 0 16px;\r\n      border-radius: 8px;\r\n    }\r\n    .partial {\r\n      background: rgba(245,158,11,0.08);\r\n      border-left: 4px solid var(--accent);\r\n    }\r\n    .missing-list {\r\n      margin-top: 10px;\r\n      font-size: 13px;\r\n      color: #e74c3c;\r\n    }\r\n    .missing-list ul {\r\n      margin: 8px 0 0 20px;\r\n      padding: 0;\r\n    }\r\n    .missing-list li {\r\n      margin-bottom: 4px;\r\n    }\r\n    .calculator-result {\r\n      background: var(--panel-2);\r\n      border: 1px solid var(--grid);\r\n      border-radius: 12px;\r\n      padding: 20px;\r\n      margin-top: 20px;\r\n    }\r\n    .result-stats {\r\n      display: grid;\r\n      grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\r\n      gap: 16px;\r\n      margin: 20px 0;\r\n    }\r\n    .stat-box {\r\n      background: #0e0e1c;\r\n      border: 1px solid #252540;\r\n      border-radius: 8px;\r\n      padding: 14px;\r\n      text-align: center;\r\n    }\r\n    .stat-label { font-size: 13px; color: var(--muted); }\r\n    .stat-value { font-size: 22px; font-weight: bold; color: var(--accent-glow); }\r\n    .calc-placeholder {\r\n      width: 64px;\r\n      height: 64px;\r\n      background: rgba(245,158,11,0.15);\r\n      border-radius: 50%;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      font-size: 32px;\r\n      color: var(--accent-glow);\r\n    }\r\n    .calc-buttons {\r\n      display: flex;\r\n      gap: 12px;\r\n      flex-wrap: wrap;\r\n      margin-top: 20px;\r\n    }\r\n    .toast {\r\n      position: fixed;\r\n      bottom: 30px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      background: var(--accent-glow);\r\n      color: #000;\r\n      font-weight: 600;\r\n      padding: 14px 28px;\r\n      border-radius: 10px;\r\n      box-shadow: 0 8px 25px rgba(0,0,0,0.5);\r\n      z-index: 10000;\r\n      opacity: 0;\r\n      transition: all 0.35s ease;\r\n      pointer-events: none;\r\n      white-space: nowrap;\r\n    }\r\n    .toast.show {\r\n      opacity: 1;\r\n      transform: translateX(-50%) translateY(-12px);\r\n    }\r\n    @media (max-width: 768px) {\r\n      .toolbar { flex-direction: column; align-items: stretch; }\r\n      .material-grid { grid-template-columns: 1fr; }\r\n      .result-stats { grid-template-columns: 1fr; }\r\n    }\r\n  <\/style>\r\n\r\n  <h1>The Quinfall Materials Database &#038; Craft Calculator<\/h1>\r\n  <p class=\"lede\">Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial) \u2022 Click recipe names for full details<\/p>\r\n\r\n  <div class=\"tabs\">\r\n    <button class=\"tab-button active\" onclick=\"openTab(0)\">Materials Lookup<\/button>\r\n    <button class=\"tab-button\" onclick=\"openTab(1)\">What Can I Craft?<\/button>\r\n    <button class=\"tab-button\" onclick=\"openTab(2)\">Calculator<\/button>\r\n  <\/div>\r\n\r\n  <!-- Materials Lookup Tab -->\r\n  <div id=\"tab-0\" class=\"tab-content\">\r\n    <div class=\"toolbar\">\r\n      <div class=\"search-container\">\r\n        <span class=\"search-icon\"><i class=\"fa fa-search\"><\/i><\/span>\r\n        <input id=\"mat-search\" class=\"search\" placeholder=\"Search material (Iron Ingot, Hemp Fiber...)\" type=\"search\">\r\n      <\/div>\r\n      <select id=\"profession-filter\">\r\n        <option value=\"\">All Professions<\/option>\r\n      <\/select>\r\n      <select id=\"sort-select\">\r\n        <option value=\"name\">Sort: Name A-Z<\/option>\r\n        <option value=\"usage\" selected>Sort: Most Used First<\/option>\r\n      <\/select>\r\n    <\/div>\r\n    <div id=\"search-results\" class=\"material-grid\"><\/div>\r\n  <\/div>\r\n\r\n  <!-- What Can I Craft Tab -->\r\n  <div id=\"tab-1\" class=\"tab-content\" style=\"display:none;\">\r\n    <h2>What Can I Craft? \u2013 Inventory Calculator<\/h2>\r\n    <div class=\"toolbar\" style=\"flex-direction:column; align-items:stretch;\">\r\n      <div style=\"display:flex; gap:10px; flex-wrap:wrap;\">\r\n        <div class=\"search-container\" style=\"flex:3;\">\r\n          <span class=\"search-icon\"><i class=\"fa fa-cubes\"><\/i><\/span>\r\n          <input list=\"material-datalist\" id=\"inv-material\" class=\"search\" placeholder=\"Add material...\">\r\n        <\/div>\r\n        <input type=\"number\" id=\"inv-qty\" value=\"1\" min=\"0\" style=\"width:90px;\">\r\n        <button onclick=\"addToInventory()\">Add \/ Update<\/button>\r\n      <\/div>\r\n      <datalist id=\"material-datalist\"><\/datalist>\r\n    <\/div>\r\n    <table id=\"inventory-table\">\r\n      <colgroup>\r\n        <col>\r\n        <col>\r\n        <col>\r\n      <\/colgroup>\r\n      <thead>\r\n        <tr>\r\n          <th>Material<\/th>\r\n          <th>Quantity<\/th>\r\n          <th><\/th>\r\n        <\/tr>\r\n      <\/thead>\r\n      <tbody><\/tbody>\r\n    <\/table>\r\n    <div class=\"partial-toggle\">\r\n      <input type=\"checkbox\" id=\"show-partial\" checked>\r\n      <label for=\"show-partial\">Show partial crafts (recipes where you have at least some ingredients)<\/label>\r\n    <\/div>\r\n    <div style=\"margin:16px 0; display:flex; gap:12px; flex-wrap:wrap;\">\r\n      <button onclick=\"calculateCrafts()\" style=\"background:rgba(39,174,96,0.25); border-color:#27ae60;\">Calculate Craftable Recipes<\/button>\r\n      <button onclick=\"clearInventory()\" style=\"margin-left:12px; color:#e74c3c; border-color:#c0392b;\">Clear Inventory<\/button>\r\n      <button onclick=\"copyShareLink()\" style=\"background:rgba(155,89,182,0.2); border-color:#9b59b6;\">Shareable Inventory Link<\/button>\r\n    <\/div>\r\n    <div id=\"craft-results\"><\/div>\r\n  <\/div>\r\n\r\n  <!-- Calculator Tab -->\r\n  <div id=\"tab-2\" class=\"tab-content\" style=\"display:none;\">\r\n    <h2>Crafting Batch Calculator<\/h2>\r\n    <p style=\"color:var(--muted);\">Select a recipe (filtered by profession\/tier if desired), enter quantity, and calculate exact requirements + totals.<\/p>\r\n    <div class=\"toolbar\" style=\"flex-direction:column; align-items:stretch; gap:16px;\">\r\n      <div style=\"display:flex; gap:12px; flex-wrap:wrap;\">\r\n        <select id=\"calc-prof-filter\" style=\"min-width:180px;\">\r\n          <option value=\"\">All Professions<\/option>\r\n        <\/select>\r\n        <select id=\"calc-tier-filter\" style=\"min-width:140px;\">\r\n          <option value=\"\">All Tiers<\/option>\r\n        <\/select>\r\n      <\/div>\r\n      <div class=\"search-container\" style=\"flex:1;\">\r\n        <span class=\"search-icon\"><i class=\"fa fa-search\"><\/i><\/span>\r\n        <input list=\"calc-recipe-datalist\" id=\"calc-recipe\" class=\"search\" placeholder=\"Search recipe (filtered list appears here)...\">\r\n      <\/div>\r\n      <datalist id=\"calc-recipe-datalist\"><\/datalist>\r\n      <div style=\"display:flex; gap:12px; align-items:center;\">\r\n        <label style=\"white-space:nowrap; color:var(--muted);\">Craft \u00d7<\/label>\r\n        <input type=\"number\" id=\"calc-quantity\" value=\"1\" min=\"1\" style=\"width:100px; padding:10px; font-size:16px;\">\r\n        <button onclick=\"runCalculator()\" style=\"padding:10px 24px;\">Calculate<\/button>\r\n      <\/div>\r\n    <\/div>\r\n    <div id=\"calculator-result\" style=\"display:none; margin-top:24px;\">\r\n      <div class=\"calculator-result\">\r\n        <div style=\"display:flex; align-items:center; gap:16px; margin-bottom:20px;\">\r\n          <div class=\"calc-placeholder\"><i class=\"fa fa-cubes\"><\/i><\/div>\r\n          <div>\r\n            <h3 id=\"calc-recipe-name\" style=\"margin:0;\"><\/h3>\r\n            <p id=\"calc-subtitle\" style=\"margin:4px 0 0; color:var(--muted);\"><\/p>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"result-stats\">\r\n          <div class=\"stat-box\">\r\n            <div class=\"stat-label\">Total XP<\/div>\r\n            <div class=\"stat-value\" id=\"calc-total-xp\"><\/div>\r\n          <\/div>\r\n          <div class=\"stat-box\">\r\n            <div class=\"stat-label\">Total Craft Time<\/div>\r\n            <div class=\"stat-value\" id=\"calc-total-time\"><\/div>\r\n          <\/div>\r\n          <div class=\"stat-box\">\r\n            <div class=\"stat-label\">Total Sale Value<\/div>\r\n            <div class=\"stat-value\" id=\"calc-total-gold\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <h3 style=\"margin:24px 0 12px;\">Farm \/ Shopping List<\/h3>\r\n        <table id=\"calc-farming-table\" style=\"width:100%;\">\r\n          <thead>\r\n            <tr>\r\n              <th>Material<\/th>\r\n              <th style=\"text-align:right;\">Quantity Needed<\/th>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody><\/tbody>\r\n        <\/table>\r\n        <div class=\"calc-buttons\">\r\n          <button onclick=\"shareCalculator()\" style=\"background:rgba(155,89,182,0.2); border-color:#9b59b6;\">Share this Calculation<\/button>\r\n          <button onclick=\"exportCalcCSV()\" style=\"background:rgba(52,152,219,0.2); border-color:#3498db;\">Export as CSV<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Modal -->\r\n  <div id=\"material-modal\" class=\"modal-overlay\" style=\"display:none;\">\r\n    <div class=\"modal\">\r\n      <span class=\"close\" onclick=\"closeModal()\">\u00d7<\/span>\r\n      <div class=\"modal-header\" id=\"modal-header\">\r\n        <h2 id=\"modal-title\"><\/h2>\r\n      <\/div>\r\n      <img id=\"modal-icon\" style=\"max-width:96px; float:right; margin:0 0 16px 16px;\" alt=\"\">\r\n      <div id=\"material-view\">\r\n        <p id=\"modal-desc\" style=\"color:var(--muted); margin-bottom:20px;\"><\/p>\r\n        <h3>Usage Statistics<\/h3>\r\n        <div id=\"modal-stats\" class=\"stats-row\"><\/div>\r\n        <h3>Recipes Using This Material<\/h3>\r\n        <div id=\"modal-recipes-list\"><\/div>\r\n      <\/div>\r\n      <div id=\"recipe-view\" style=\"display:none;\">\r\n        <div class=\"back-link\" id=\"recipe-back-link\">\r\n          <i class=\"fa fa-arrow-left\"><\/i> Back\r\n        <\/div>\r\n        <h2 id=\"recipe-name\" style=\"margin:16px 0 8px;\"><\/h2>\r\n        <div id=\"recipe-subtitle\" style=\"color:var(--muted); margin-bottom:16px;\"><\/div>\r\n        <div class=\"recipe-detail-grid\">\r\n          <div class=\"detail-box\"><div class=\"detail-label\">XP<\/div><div class=\"detail-value\" id=\"recipe-xp\"><\/div><\/div>\r\n          <div class=\"detail-box\"><div class=\"detail-label\">Craft Time<\/div><div class=\"detail-value\" id=\"recipe-time\"><\/div><\/div>\r\n          <div class=\"detail-box\"><div class=\"detail-label\">Sale Price<\/div><div class=\"detail-value\" id=\"recipe-price\"><\/div><\/div>\r\n        <\/div>\r\n        <h3 style=\"margin:24px 0 8px;\"><i class=\"fa fa-cubes\"><\/i> Ingredients<\/h3>\r\n        <div class=\"ingredients-grid\" id=\"recipe-ingredients\"><\/div>\r\n        <h3 style=\"margin:24px 0 8px;\"><i class=\"fa fa-info-circle\"><\/i> Description<\/h3>\r\n        <p id=\"recipe-desc\" style=\"color:#ccd;\"><\/p>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    \/\/ \u2500\u2500\u2500 Constants & Globals \u2500\u2500\u2500\r\n    const JSON_URL = document.getElementById('quinfall-materials-tools').dataset.json;\r\n    let allRecipes = [];\r\n    let materialIndex = {};\r\n    let allMaterials = new Set();\r\n    let professions = new Set();\r\n    let inventory = JSON.parse(localStorage.getItem('quinfall_inventory') || '{}');\r\n    let currentMaterial = null;\r\n\r\n    \/\/ \u2500\u2500\u2500 Toast Helper \u2500\u2500\u2500\r\n    function showToast(message) {\r\n      const toast = document.createElement('div');\r\n      toast.className = 'toast';\r\n      toast.textContent = message;\r\n      document.body.appendChild(toast);\r\n      setTimeout(() => toast.classList.add('show'), 10);\r\n      setTimeout(() => {\r\n        toast.classList.remove('show');\r\n        setTimeout(() => toast.remove(), 400);\r\n      }, 2600);\r\n    }\r\n\r\n    \/\/ \u2500\u2500\u2500 Tab Switch \u2500\u2500\u2500\r\n    function openTab(n) {\r\n      document.querySelectorAll('.tab-content').forEach(el => el.style.display = 'none');\r\n      document.getElementById(`tab-${n}`).style.display = 'block';\r\n      document.querySelectorAll('.tab-button').forEach(b => b.classList.remove('active'));\r\n      document.querySelectorAll('.tab-button')[n].classList.add('active');\r\n    }\r\n\r\n    \/\/ \u2500\u2500\u2500 Materials Lookup \u2500\u2500\u2500\r\n    function renderMaterials() {\r\n      const q = document.getElementById('mat-search')?.value.trim().toLowerCase() || '';\r\n      const prof = document.getElementById('profession-filter')?.value || '';\r\n      const sort = document.getElementById('sort-select')?.value || 'name';\r\n\r\n      let mats = Object.keys(materialIndex);\r\n\r\n      if (q) {\r\n        mats = mats.filter(m => m.toLowerCase().includes(q));\r\n      }\r\n\r\n      if (prof) {\r\n        mats = mats.filter(m => materialIndex[m]?.some(r => r.profession === prof));\r\n      }\r\n\r\n      mats.sort((a, b) => {\r\n        if (sort === 'usage') {\r\n          return (materialIndex[b]?.length || 0) - (materialIndex[a]?.length || 0);\r\n        }\r\n        return a.localeCompare(b);\r\n      });\r\n\r\n      const grid = document.getElementById('search-results');\r\n      if (grid) {\r\n        grid.innerHTML = mats.map(mat => {\r\n          const cnt = materialIndex[mat]?.length || 0;\r\n          return `\r\n            <div class=\"material-card\" onclick=\"showMaterial('${mat.replace(\/'\/g,\"\\\\'\")}')\">\r\n              <strong>${mat}<\/strong>\r\n              <div class=\"stats-row\">\r\n                <span>Used in <b style=\"color:var(--accent);\">${cnt}<\/b> recipe${cnt===1?'':'s'}<\/span>\r\n              <\/div>\r\n            <\/div>\r\n          `;\r\n        }).join('') || '<div style=\"padding:40px; text-align:center; color:var(--muted);\">No materials match your search.<\/div>';\r\n      }\r\n    }\r\n\r\n    function showMaterial(mat) {\r\n      currentMaterial = mat;\r\n      const recs = materialIndex[mat] || [];\r\n      document.getElementById('modal-title').textContent = mat;\r\n      document.getElementById('modal-icon').src = recs[0]?.icon || '';\r\n      document.getElementById('modal-desc').textContent = `Used in ${recs.length} crafting recipe${recs.length===1?'':'s'}.`;\r\n      document.getElementById('modal-stats').innerHTML = `\r\n        <span>Recipes: <b style=\"color:var(--accent);\">${recs.length}<\/b><\/span>\r\n        <span>Professions: <b style=\"color:var(--accent);\">${new Set(recs.map(r=>r.profession)).size}<\/b><\/span>\r\n      `;\r\n      document.getElementById('modal-recipes-list').innerHTML = recs.map(r => `\r\n        <div class=\"recipe-list-item\" onclick=\"showRecipe('${r.id}', '${mat.replace(\/'\/g,\"\\\\'\")}')\">\r\n          <strong>${r.name}<\/strong><br>\r\n          <small style=\"color:var(--muted);\">${r.profession} \u2022 ${r.tier} \u2022 Lv ${r.level} \u2022 \u00d7${r.quantity}<\/small>\r\n        <\/div>\r\n      `).join('');\r\n      document.getElementById('material-view').style.display = 'block';\r\n      document.getElementById('recipe-view').style.display = 'none';\r\n      document.getElementById('material-modal').style.display = 'flex';\r\n    }\r\n\r\n    function showRecipe(recipeId, fromMaterial = null) {\r\n      const recipe = allRecipes.find(r => r.id === recipeId);\r\n      if (!recipe) return;\r\n\r\n      document.getElementById('recipe-name').textContent = recipe.name;\r\n      document.getElementById('recipe-subtitle').textContent = `${recipe.profession} \u2022 ${recipe.tier || '\u2014'} \u2022 Required Level ${recipe.required_level || 'N\/A'}`;\r\n      document.getElementById('recipe-xp').textContent = recipe.xp || '\u2014';\r\n      document.getElementById('recipe-time').textContent = recipe.craft_time || '\u2014';\r\n      document.getElementById('recipe-price').textContent = recipe.sale_price || '\u2014';\r\n      document.getElementById('recipe-desc').textContent = recipe.description || 'No description available.';\r\n      document.getElementById('recipe-ingredients').innerHTML = (recipe.ingredients || []).map(i => `\r\n        <div class=\"ing-item\">\r\n          <span>${i.material}<\/span>\r\n          <span class=\"ing-qty\">\u00d7${i.quantity}<\/span>\r\n        <\/div>\r\n      `).join('');\r\n\r\n      const backLink = document.getElementById('recipe-back-link');\r\n      if (backLink) {\r\n        if (fromMaterial) {\r\n          backLink.innerHTML = `<i class=\"fa fa-arrow-left\"><\/i> Back to ${fromMaterial} recipes`;\r\n          backLink.onclick = () => showMaterial(fromMaterial);\r\n        } else {\r\n          backLink.innerHTML = `<i class=\"fa fa-arrow-left\"><\/i> Back to craft results`;\r\n          backLink.onclick = closeModal;\r\n        }\r\n      }\r\n\r\n      document.getElementById('material-view').style.display = 'none';\r\n      document.getElementById('recipe-view').style.display = 'block';\r\n      document.getElementById('material-modal').style.display = 'flex';\r\n    }\r\n\r\n    function closeModal() {\r\n      document.getElementById('material-modal').style.display = 'none';\r\n    }\r\n\r\n    \/\/ \u2500\u2500\u2500 Inventory Management \u2500\u2500\u2500\r\n    function saveInv() {\r\n      localStorage.setItem('quinfall_inventory', JSON.stringify(inventory));\r\n    }\r\n\r\n    function renderInventory() {\r\n      const tbody = document.querySelector('#inventory-table tbody');\r\n      if (!tbody) return;\r\n      tbody.innerHTML = Object.keys(inventory).sort().map(mat => `\r\n        <tr>\r\n          <td>${mat}<\/td>\r\n          <td><input type=\"number\" value=\"${inventory[mat]}\" onchange=\"updateInvQty('${mat.replace(\/'\/g,\"\\\\'\")}', this.value)\" style=\"width:100%; box-sizing:border-box; background:#0d0d18; border:1px solid #25253a; color:white; padding:5px;\"><\/td>\r\n          <td style=\"text-align:center;\"><button onclick=\"removeInv('${mat.replace(\/'\/g,\"\\\\'\")}')\" style=\"color:#e74c3c; border:none; background:none; cursor:pointer; font-size:18px;\">\u00d7<\/button><\/td>\r\n        <\/tr>\r\n      `).join('') || '<tr><td colspan=\"3\" style=\"text-align:center; padding:20px; color:var(--muted);\">No items in inventory yet.<\/td><\/tr>';\r\n    }\r\n\r\n    function addToInventory() {\r\n      const mat = document.getElementById('inv-material')?.value.trim() || '';\r\n      const qty = parseInt(document.getElementById('inv-qty')?.value) || 0;\r\n      if (!mat || qty <= 0) return;\r\n      inventory[mat] = (inventory[mat] || 0) + qty;\r\n      saveInv();\r\n      renderInventory();\r\n      document.getElementById('inv-material').value = '';\r\n    }\r\n\r\n    function updateInvQty(mat, val) {\r\n      val = parseInt(val);\r\n      if (val > 0) inventory[mat] = val; else delete inventory[mat];\r\n      saveInv();\r\n    }\r\n\r\n    function removeInv(mat) {\r\n      delete inventory[mat];\r\n      saveInv();\r\n      renderInventory();\r\n    }\r\n\r\n    function clearInventory() {\r\n      if (confirm('Clear entire inventory?')) {\r\n        inventory = {};\r\n        saveInv();\r\n        renderInventory();\r\n      }\r\n    }\r\n\r\n    function calculateCrafts() {\r\n      const resDiv = document.getElementById('craft-results');\r\n      if (!resDiv) return;\r\n      resDiv.innerHTML = '';\r\n\r\n      const showPartial = document.getElementById('show-partial')?.checked ?? false;\r\n\r\n      let results = allRecipes\r\n        .filter(r => r.ingredients?.length)\r\n        .map(r => {\r\n          let max = Infinity;\r\n          let hasSome = false;\r\n          let missing = [];\r\n          r.ingredients.forEach(i => {\r\n            const have = inventory[i.material] || 0;\r\n            if (have > 0) hasSome = true;\r\n            if (have < i.quantity) {\r\n              missing.push(`${i.material} (need ${i.quantity - have} more)`);\r\n            }\r\n            max = Math.min(max, Math.floor(have \/ i.quantity));\r\n          });\r\n          return { recipe: r, max, hasSome, missing };\r\n        })\r\n        .filter(item => item.max >= 1 || (showPartial && item.hasSome))\r\n        .sort((a,b) => b.max - a.max);\r\n\r\n      if (!results.length) {\r\n        resDiv.innerHTML = '<p style=\"color:#e74c3c; text-align:center; padding:40px;\">No recipes match your inventory.<\/p>';\r\n        return;\r\n      }\r\n\r\n      results.forEach(item => {\r\n        const r = item.recipe;\r\n        const div = document.createElement('div');\r\n        div.className = item.max >= 1 ? 'craftable' : 'craftable partial';\r\n        div.innerHTML = `\r\n          <strong onclick=\"showRecipe('${r.id}')\" style=\"cursor:pointer; color:var(--accent-glow);\">${r.name}<\/strong> (${r.profession})<br>\r\n          <span style=\"color:var(--accent-glow);\">\r\n            ${item.max >= 1 ? `You can make <b>${item.max}<\/b>` : 'Partial craft possible'}\r\n          <\/span><br>\r\n          <small style=\"color:var(--muted);\">${r.tier} \u2022 Lv ${r.required_level || '\u2014'}<\/small>\r\n          ${item.missing.length ? `\r\n            <details class=\"missing-list\">\r\n              <summary>Show missing items (${item.missing.length})<\/summary>\r\n              <ul>${item.missing.map(m => `<li>${m}<\/li>`).join('')}<\/ul>\r\n            <\/details>\r\n          ` : ''}\r\n        `;\r\n        resDiv.appendChild(div);\r\n      });\r\n    }\r\n\r\n    \/\/ \u2500\u2500\u2500 Share Functions \u2500\u2500\u2500\r\n    function copyShareLink() {\r\n      try {\r\n        const compressed = btoa(JSON.stringify(inventory));\r\n        const url = `${window.location.origin}${window.location.pathname}?tab=1#inv=${compressed}`;\r\n        navigator.clipboard.writeText(url).then(() => {\r\n          showToast('Inventory share link copied!');\r\n        }).catch(() => {\r\n          prompt('Copy this link manually:', url);\r\n        });\r\n      } catch (e) {\r\n        showToast('Could not create share link');\r\n      }\r\n    }\r\n\r\n    function shareCalculator() {\r\n      if (!window.currentCalc) {\r\n        showToast('Please calculate a recipe first');\r\n        return;\r\n      }\r\n      const { recipeId, quantity } = window.currentCalc;\r\n      const compressed = btoa(JSON.stringify({ recipeId, quantity }));\r\n      const url = `${window.location.origin}${window.location.pathname}?tab=2#calc=${compressed}`;\r\n      navigator.clipboard.writeText(url).then(() => {\r\n        showToast('Calculation link copied!');\r\n      }).catch(() => {\r\n        prompt('Copy this link manually:', url);\r\n      });\r\n    }\r\n\r\n    \/\/ \u2500\u2500\u2500 Calculator \u2500\u2500\u2500\r\n    function updateCalcDatalist() {\r\n      const profFilter = document.getElementById('calc-prof-filter')?.value || '';\r\n      const tierFilter = document.getElementById('calc-tier-filter')?.value || '';\r\n      const dl = document.getElementById('calc-recipe-datalist');\r\n      if (!dl) return;\r\n      dl.innerHTML = '';\r\n\r\n      let filtered = allRecipes;\r\n      if (profFilter) filtered = filtered.filter(r => r.profession === profFilter);\r\n      if (tierFilter) filtered = filtered.filter(r => (r.tier || '').includes(tierFilter));\r\n\r\n      filtered.sort((a,b) => a.name.localeCompare(b.name)).forEach(r => {\r\n        const opt = document.createElement('option');\r\n        opt.value = `${r.name} (${r.tier || '\u2014'})`;\r\n        opt.dataset.id = r.id;\r\n        dl.appendChild(opt);\r\n      });\r\n    }\r\n\r\n    function runCalculator() {\r\n      const inputField = document.getElementById('calc-recipe');\r\n      if (!inputField) return;\r\n\r\n      const selectedOption = Array.from(document.getElementById('calc-recipe-datalist')?.options || [])\r\n        .find(opt => opt.value === inputField.value);\r\n\r\n      if (!selectedOption || !selectedOption.dataset.id) {\r\n        showToast('Please select a valid recipe from the list');\r\n        return;\r\n      }\r\n\r\n      const recipeId = selectedOption.dataset.id;\r\n      const recipe = allRecipes.find(r => r.id === recipeId);\r\n      if (!recipe) {\r\n        showToast('Recipe not found');\r\n        return;\r\n      }\r\n\r\n      const qty = parseInt(document.getElementById('calc-quantity')?.value) || 1;\r\n\r\n      let totalXP = (parseInt(recipe.xp) || 0) * qty;\r\n      let totalGold = (parseInt(recipe.sale_price) || 0) * qty;\r\n\r\n      let secondsPerCraft = 0;\r\n      const timeStr = (recipe.craft_time || \"\").toLowerCase().replace(\/\\s\/g, '');\r\n      const num = parseFloat(timeStr) || 0;\r\n      if (timeStr.includes('hour') || timeStr.includes('hr')) secondsPerCraft = num * 3600;\r\n      else if (timeStr.includes('min')) secondsPerCraft = num * 60;\r\n      else if (timeStr.includes('sec')) secondsPerCraft = num;\r\n      else secondsPerCraft = num;\r\n\r\n      const totalSeconds = secondsPerCraft * qty;\r\n      const hours = Math.floor(totalSeconds \/ 3600);\r\n      const minutes = Math.floor((totalSeconds % 3600) \/ 60);\r\n      const seconds = totalSeconds % 60;\r\n\r\n      let timeFormatted = '';\r\n      if (hours) timeFormatted += `${hours}h `;\r\n      if (minutes) timeFormatted += `${minutes}m `;\r\n      if (seconds || totalSeconds === 0) timeFormatted += `${seconds}s`;\r\n      timeFormatted = timeFormatted.trim() || 'Instant';\r\n\r\n      const tbody = document.querySelector('#calc-farming-table tbody');\r\n      if (tbody) {\r\n        tbody.innerHTML = (recipe.ingredients || []).map(ing => `\r\n          <tr>\r\n            <td>${ing.material}<\/td>\r\n            <td style=\"text-align:right; font-weight:bold; color:var(--accent);\">${(ing.quantity * qty).toLocaleString()}<\/td>\r\n          <\/tr>\r\n        `).join('') || '<tr><td colspan=\"2\" style=\"text-align:center; padding:20px; color:var(--muted);\">No ingredients listed<\/td><\/tr>';\r\n      }\r\n\r\n      document.getElementById('calc-recipe-name').textContent = recipe.name;\r\n      document.getElementById('calc-subtitle').textContent = `${recipe.profession} \u2022 ${recipe.tier || '\u2014'} \u2022 Lv ${recipe.required_level || '\u2014'}`;\r\n      document.getElementById('calc-total-xp').textContent = totalXP.toLocaleString();\r\n      document.getElementById('calc-total-time').textContent = timeFormatted;\r\n      document.getElementById('calc-total-gold').textContent = totalGold.toLocaleString();\r\n      document.getElementById('calculator-result').style.display = 'block';\r\n\r\n      window.currentCalc = { recipeId: recipe.id, quantity: qty };\r\n    }\r\n\r\n    function exportCalcCSV() {\r\n      const table = document.getElementById('calc-farming-table');\r\n      if (!table || table.style.display === 'none') {\r\n        showToast('Run a calculation first');\r\n        return;\r\n      }\r\n\r\n      const rows = [['Material', 'Quantity Needed']];\r\n      Array.from(table.querySelectorAll('tbody tr')).forEach(tr => {\r\n        const tds = Array.from(tr.cells).map(td => td.textContent.trim());\r\n        if (tds[0]) rows.push(tds);\r\n      });\r\n\r\n      const csv = rows.map(r => r.map(v => `\"${v.replace(\/\"\/g,'\"\"')}\"`).join(',')).join('\\n');\r\n      const blob = new Blob([csv], { type: 'text\/csv' });\r\n      const url = URL.createObjectURL(blob);\r\n      const a = document.createElement('a');\r\n      a.href = url;\r\n      a.download = 'quinfall_calc_shopping_list.csv';\r\n      a.click();\r\n      URL.revokeObjectURL(url);\r\n    }\r\n\r\n    \/\/ \u2500\u2500\u2500 Data Loading \u2500\u2500\u2500\r\n    fetch(JSON_URL)\r\n      .then(r => r.json())\r\n      .then(data => {\r\n        allRecipes = data;\r\n\r\n        allRecipes.forEach(r => {\r\n          if (!r.ingredients) return;\r\n          professions.add(r.profession);\r\n          r.ingredients.forEach(ing => {\r\n            const mat = ing.material.trim();\r\n            allMaterials.add(mat);\r\n            if (!materialIndex[mat]) materialIndex[mat] = [];\r\n            materialIndex[mat].push({\r\n              name: r.name,\r\n              profession: r.profession,\r\n              tier: r.tier || '\u2014',\r\n              level: r.required_level || 'N\/A',\r\n              quantity: ing.quantity,\r\n              icon: r.icon_url,\r\n              id: r.id\r\n            });\r\n          });\r\n        });\r\n\r\n        \/\/ Populate profession filter (Materials tab)\r\n        const profSel = document.getElementById('profession-filter');\r\n        if (profSel) {\r\n          Array.from(professions).sort().forEach(p => {\r\n            const o = document.createElement('option');\r\n            o.value = p;\r\n            o.textContent = p;\r\n            profSel.appendChild(o);\r\n          });\r\n        }\r\n\r\n        \/\/ Populate material datalist (Inventory tab)\r\n        const matDL = document.getElementById('material-datalist');\r\n        if (matDL) {\r\n          Array.from(allMaterials).sort().forEach(m => {\r\n            const o = document.createElement('option');\r\n            o.value = m;\r\n            matDL.appendChild(o);\r\n          });\r\n        }\r\n\r\n        \/\/ Populate calculator profession filter\r\n        const calcProfSel = document.getElementById('calc-prof-filter');\r\n        if (calcProfSel) {\r\n          Array.from(professions).sort().forEach(p => {\r\n            const o = document.createElement('option');\r\n            o.value = p;\r\n            o.textContent = p;\r\n            calcProfSel.appendChild(o);\r\n          });\r\n        }\r\n\r\n        \/\/ Populate calculator tier filter\r\n        const tierMap = new Set();\r\n        allRecipes.forEach(r => {\r\n          const tierStr = (r.tier || '').trim();\r\n          if (!tierStr) return;\r\n          const match = tierStr.match(\/tier\\s*(\\d+)\/i);\r\n          if (match && match[1]) tierMap.add(`Tier ${parseInt(match[1])}`);\r\n          else if (\/^tier\\s*\\d+$\/i.test(tierStr)) tierMap.add(tierStr);\r\n        });\r\n\r\n        const sortedTiers = Array.from(tierMap).sort((a,b) => {\r\n          const na = parseInt(a.replace(\/\\D\/g,'')) || 0;\r\n          const nb = parseInt(b.replace(\/\\D\/g,'')) || 0;\r\n          return na - nb;\r\n        });\r\n\r\n        const calcTierSel = document.getElementById('calc-tier-filter');\r\n        if (calcTierSel) {\r\n          sortedTiers.forEach(t => {\r\n            const o = document.createElement('option');\r\n            o.value = t;\r\n            o.textContent = t;\r\n            calcTierSel.appendChild(o);\r\n          });\r\n        }\r\n\r\n        updateCalcDatalist();\r\n        renderMaterials();\r\n        renderInventory();\r\n\r\n        \/\/ \u2500\u2500\u2500 LIVE FILTERING FOR MATERIALS TAB \u2500\u2500\u2500\r\n        document.getElementById('mat-search')?.addEventListener('input', renderMaterials);\r\n        document.getElementById('profession-filter')?.addEventListener('change', renderMaterials);\r\n        document.getElementById('sort-select')?.addEventListener('change', renderMaterials);\r\n      })\r\n      .catch(err => {\r\n        console.error('Failed to load recipes:', err);\r\n        const results = document.getElementById('search-results');\r\n        if (results) results.innerHTML = '<p style=\"color:#e74c3c; text-align:center; padding:40px;\">Failed to load data. Please refresh the page.<\/p>';\r\n      });\r\n\r\n    \/\/ Initial render\r\n    renderInventory();\r\n\r\n    \/\/ \u2500\u2500\u2500 Load shared data from URL \u2500\u2500\u2500\r\n    window.addEventListener('load', () => {\r\n      const params = new URLSearchParams(window.location.search);\r\n      const hash = window.location.hash;\r\n\r\n      const tabParam = params.get('tab');\r\n      if (tabParam === '1') openTab(1);\r\n      if (tabParam === '2') openTab(2);\r\n\r\n      if (hash.startsWith('#calc=')) {\r\n        const compressed = hash.substring(6);\r\n        try {\r\n          const { recipeId, quantity } = JSON.parse(atob(compressed));\r\n          const recipe = allRecipes.find(r => r.id === recipeId);\r\n          if (recipe) {\r\n            openTab(2);\r\n            document.getElementById('calc-recipe').value = `${recipe.name} (${recipe.tier || '\u2014'})`;\r\n            document.getElementById('calc-quantity').value = quantity || 1;\r\n            runCalculator();\r\n            showToast('Loaded shared calculation!');\r\n          }\r\n        } catch (e) {\r\n          console.error('Invalid calc link');\r\n        }\r\n      }\r\n\r\n      if (hash.startsWith('#inv=')) {\r\n        const compressed = hash.substring(5);\r\n        try {\r\n          inventory = JSON.parse(atob(compressed));\r\n          saveInv();\r\n          renderInventory();\r\n          openTab(1);\r\n          showToast('Loaded shared inventory!');\r\n        } catch (e) {\r\n          console.error('Invalid inventory link');\r\n        }\r\n      }\r\n\r\n      history.replaceState(null, null, window.location.pathname + (tabParam ? '?tab=' + tabParam : ''));\r\n    });\r\n\r\n    document.getElementById('calc-prof-filter')?.addEventListener('change', updateCalcDatalist);\r\n    document.getElementById('calc-tier-filter')?.addEventListener('change', updateCalcDatalist);\r\n  <\/script>\r\n<\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>The Quinfall Materials Database &#038; Craft Calculator Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial) \u2022 Click recipe names for full details Materials Lookup What Can I Craft? Calculator All Professions Sort: Name A-ZSort: Most Used First What Can I Craft? \u2013 Inventory Calculator Add [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":257,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5],"tags":[],"class_list":["post-242","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guides","category-tools"],"yoast_head":"<!-- Meta Tags -->\r\n<title>Materials Calculator - What Can I Make? - The Quinfall<\/title>\r\n<meta name=\"description\" content=\"The Quinfall Materials Database &amp; Craft Calculator Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial)\" \/>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/\" \/>\r\n<meta property=\"og:locale\" content=\"en_US\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"Materials Calculator - What Can I Make? - The Quinfall\" \/>\r\n<meta property=\"og:description\" content=\"The Quinfall Materials Database &amp; Craft Calculator Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial)\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/\" \/>\r\n<meta property=\"og:site_name\" content=\"The Quinfall\" \/>\r\n<meta property=\"article:publisher\" content=\"facebook.com\/gamingwithdaopa\/\" \/>\r\n<meta property=\"article:author\" content=\"facebook.com\/gamingwithdaopa\/\" \/>\r\n<meta property=\"article:published_time\" content=\"2026-02-12T13:40:22+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2026-02-13T01:50:00+00:00\" \/>\r\n<meta property=\"og:image\" content=\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg\" \/>\r\n\t<meta property=\"og:image:width\" content=\"400\" \/>\r\n\t<meta property=\"og:image:height\" content=\"263\" \/>\r\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\r\n<meta name=\"author\" content=\"daopa\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:creator\" content=\"@gamingwithdaopa\" \/>\r\n<meta name=\"twitter:site\" content=\"@gamingwithdaopa\" \/>\r\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"daopa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/\"},\"author\":{\"name\":\"daopa\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\"},\"headline\":\"Materials Calculator &#8211; What Can I Make?\",\"datePublished\":\"2026-02-12T13:40:22+00:00\",\"dateModified\":\"2026-02-13T01:50:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/\"},\"wordCount\":139,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\"},\"image\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg\",\"articleSection\":[\"Guides\",\"Tools\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/\",\"name\":\"Materials Calculator - What Can I Make? - The Quinfall\",\"isPartOf\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg\",\"datePublished\":\"2026-02-12T13:40:22+00:00\",\"dateModified\":\"2026-02-13T01:50:00+00:00\",\"description\":\"The Quinfall Materials Database & Craft Calculator Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial)\",\"breadcrumb\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg\",\"contentUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg\",\"width\":400,\"height\":263,\"caption\":\"the quinfall materials tool\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Materials Calculator &#8211; What Can I Make?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#website\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/\",\"name\":\"The Quinfall\",\"description\":\"DaOpa&#039;s The Quinfall fansite for an extensive collection of videos, in-depth guides, detailed maps, and a wealth of game-related insights and articles.\",\"publisher\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\"},\"alternateName\":\"quinfall\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\",\"name\":\"daopa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2025\/01\/gp.jpg\",\"contentUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2025\/01\/gp.jpg\",\"width\":116,\"height\":172,\"caption\":\"daopa\"},\"logo\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/image\/\"},\"description\":\"DaOpa has been variety streamer since 2009 with game focuses on primarily MMOs, Sandbox, RPG and FPS genres. For inquires comment in the comments sections. This channel is syndicated across various micro niche gaming related blogs operated by DaOpa. He creates fansites, guides, tools for gamers\",\"sameAs\":[\"https:\/\/gamingwithdaopa.ellatha.com\",\"facebook.com\/gamingwithdaopa\/\",\"https:\/\/x.com\/gamingwithdaopa\",\"youtube.com\/@daopa\"],\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/author\/daopa\/\"}]}<\/script>","yoast_head_json":{"title":"Materials Calculator - What Can I Make? - The Quinfall","description":"The Quinfall Materials Database & Craft Calculator Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/","og_locale":"en_US","og_type":"article","og_title":"Materials Calculator - What Can I Make? - The Quinfall","og_description":"The Quinfall Materials Database & Craft Calculator Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial)","og_url":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/","og_site_name":"The Quinfall","article_publisher":"facebook.com\/gamingwithdaopa\/","article_author":"facebook.com\/gamingwithdaopa\/","article_published_time":"2026-02-12T13:40:22+00:00","article_modified_time":"2026-02-13T01:50:00+00:00","og_image":[{"width":400,"height":263,"url":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg","type":"image\/jpeg"}],"author":"daopa","twitter_card":"summary_large_image","twitter_creator":"@gamingwithdaopa","twitter_site":"@gamingwithdaopa","twitter_misc":{"Written by":"daopa","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#article","isPartOf":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/"},"author":{"name":"daopa","@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638"},"headline":"Materials Calculator &#8211; What Can I Make?","datePublished":"2026-02-12T13:40:22+00:00","dateModified":"2026-02-13T01:50:00+00:00","mainEntityOfPage":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/"},"wordCount":139,"commentCount":1,"publisher":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638"},"image":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage"},"thumbnailUrl":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg","articleSection":["Guides","Tools"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/","url":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/","name":"Materials Calculator - What Can I Make? - The Quinfall","isPartOf":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage"},"image":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage"},"thumbnailUrl":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg","datePublished":"2026-02-12T13:40:22+00:00","dateModified":"2026-02-13T01:50:00+00:00","description":"The Quinfall Materials Database & Craft Calculator Reverse lookup every material \u2022 Track your inventory \u2022 See exactly what you can craft (full or partial)","breadcrumb":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#primaryimage","url":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg","contentUrl":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2026\/02\/the-quinfall-materials-tool.jpg","width":400,"height":263,"caption":"the quinfall materials tool"},{"@type":"BreadcrumbList","@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/crafting-materials-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/"},{"@type":"ListItem","position":2,"name":"Materials Calculator &#8211; What Can I Make?"}]},{"@type":"WebSite","@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#website","url":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/","name":"The Quinfall","description":"DaOpa&#039;s The Quinfall fansite for an extensive collection of videos, in-depth guides, detailed maps, and a wealth of game-related insights and articles.","publisher":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638"},"alternateName":"quinfall","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/fb03a927907d90f409fac550ba375638","name":"daopa","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/image\/","url":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2025\/01\/gp.jpg","contentUrl":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-content\/uploads\/sites\/35\/2025\/01\/gp.jpg","width":116,"height":172,"caption":"daopa"},"logo":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/#\/schema\/person\/image\/"},"description":"DaOpa has been variety streamer since 2009 with game focuses on primarily MMOs, Sandbox, RPG and FPS genres. For inquires comment in the comments sections. This channel is syndicated across various micro niche gaming related blogs operated by DaOpa. He creates fansites, guides, tools for gamers","sameAs":["https:\/\/gamingwithdaopa.ellatha.com","facebook.com\/gamingwithdaopa\/","https:\/\/x.com\/gamingwithdaopa","youtube.com\/@daopa"],"url":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/author\/daopa\/"}]}},"_links":{"self":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/posts\/242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/comments?post=242"}],"version-history":[{"count":4,"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/posts\/242\/revisions"}],"predecessor-version":[{"id":280,"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/posts\/242\/revisions\/280"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/media\/257"}],"wp:attachment":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/media?parent=242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/categories?post=242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/thequinfall\/wp-json\/wp\/v2\/tags?post=242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}