CINXE.COM
Roll20 Marketplace: Digital maps, tokens, tiles, and modules for online tabletop gaming
<!DOCTYPE html> <html lang="en"> <head> <meta name=“facebook-domain-verification” content=“lb07chyng6etwkpmjwu29mkje960mx” /> <!-- Google Tag Manager --> <script id="gtmScript" nonce=''>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl+ '>m_auth=RyNPjkDTh-LgK4oo5gJi6A>m_preview=env-1>m_cookies_win=x'; var n=d.querySelector('[nonce]');n&&j.setAttribute('nonce',n.nonce||n.getAttribute('nonce'));f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-MKL9HM6');</script> <!-- End Google Tag Manager --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Roll20 Marketplace: Digital maps, tokens, tiles, and modules for online tabletop gaming</title> <meta property="og:title" content="Roll20 - Virtual Tabletop for Playing D&D, Pathfinder, Call of Cthulhu, TTRPGs" /><meta property='og:type' content='website' /> <meta property='og:url' content='https://marketplace.roll20.net/browse/search' /> <meta property='og:image' content='images/roll20-marketplace-og.jpg' /> <meta property="og:description" content="From officially produced adventures to independent creators, there are thousands of ways to make your games better, easier, and more fun with the Roll20 Marketplace." /><meta property='og:locale' content='en_US' /> <meta property='og:locale:alternate' content='af_ZA' /> <meta property='og:locale:alternate' content='ca_CA' /> <meta property='og:locale:alternate' content='zh_Hant_TW' /> <meta property='og:locale:alternate' content='cs_CZ' /> <meta property='og:locale:alternate' content='da_DK' /> <meta property='og:locale:alternate' content='nl_NL' /> <meta property='og:locale:alternate' content='fr_FR' /> <meta property='og:locale:alternate' content='de_DE' /> <meta property='og:locale:alternate' content='el_GR' /> <meta property='og:locale:alternate' content='he_IL' /> <meta property='og:locale:alternate' content='hu_HU' /> <meta property='og:locale:alternate' content='it_IT' /> <meta property='og:locale:alternate' content='ja_JP' /> <meta property='og:locale:alternate' content='ko_KR' /> <meta property='og:locale:alternate' content='pl_PL' /> <meta property='og:locale:alternate' content='pt_PT' /> <meta property='og:locale:alternate' content='ru_RU' /> <meta property='og:locale:alternate' content='es_ES' /> <meta property='og:locale:alternate' content='sv_SE' /> <meta property='og:locale:alternate' content='tr_TR' /> <meta property='og:locale:alternate' content='uk_UK' /> <meta property="og:site_name" content="Roll20" /> <meta property="og:logo" content="https://roll20.net/images/logo-die-large.png?1742502686" /> <meta property="og:image:alt" content='Roll20 logo, a pink and purple 20-sided die with the number twenty featured on its face. The die sits on top of the name "Roll20" in black font.' /> <meta name="twitter:card" content="summary"/> <meta name="twitter:site" content="@roll20app"/> <link rel="stylesheet" href="/v3/assets/css/marketplace-v3.css?1742502686" type="text/css" /> <link rel="stylesheet" href="/v3/assets/js/libs/@fortawesome/fontawesome-free/css/all.min.css?1742502686" type="text/css" /> <link rel="stylesheet" href="/css/fonts.css?1742502685" type="text/css" /> <link rel="stylesheet" href="/v2/css/colors.css?1742502686" type="text/css" /> <script type="text/javascript" src="/assets/marketplace.js?1742502686"></script> <script type="text/javascript" src="/assets/marketplace-search.js?1742502686"></script> <script type="text/javascript"> $('html').attr('data-theme', 'light'); </script> <script src="https://js.stripe.com/v3/"></script> <script type="text/javascript"> const stripe = Stripe("pk_live_1vH03GH31ZvT2lI7yU8bcClq9jDHOPU4OlnsWqZKu2s4Vs014SXpmjsjnRv37wD8PhLLkYj1YcLSxVDbdzba2HZiQ00qGgUFDqB"); const elements = stripe.elements(); </script> <script type="text/javascript"> const url = new URL(window.location.href); url.pathname = url.pathname.split('/').slice(0, 3).join('/'); // get the first one or two parts of the url path i.e. '/campaigns/search' or '/login' var _conv_page_type = url.toString(); var _conv_category_id = ""; // unused var _conv_category_name = ""; // only used in V2 marketplace var _conv_product_sku = ""; // only used in V2 marketplace var _conv_product_name = ""; // only used in V2 marketplace & characters var _conv_product_price = ""; // only used in V2 marketplace var _conv_customer_id = 'visitor'; var _conv_custom_v1 = 'loggedout'; var _conv_custom_v2 = ""; // unused var _conv_custom_v3 = ""; // unused var _conv_custom_v4 = ""; // unused </script> <script type="text/javascript" src="//cdn-4.convertexperiments.com/v1/js/10042023-10042444.js" integrity="sha384-gSDcZjQNbDoXzGah4K3Gb02Y6qVZNgNiMUn6LdQ5FCsldO6ne//TUKkgKabzB65Z"></script> </head> <body> <a href="#mainContent" class="skip-link">Skip to Main Content</a> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MKL9HM6>m_auth=RyNPjkDTh-LgK4oo5gJi6A>m_preview=env-1>m_cookies_win=x" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <script> const navClick = function(url) { location.assign(url); } </script> <header id="header" class="header header-legacy" role="banner"> <div class="header-top"> <div class="container"> <div class="d-flex py-3 flex-column flex-lg-row justify-content-start justify-content-lg-between align-items-lg-center"> <div class="header-logo order-1 order-lg-0"> <a href="https://app.roll20.net"> <img src="https://app.roll20.net/v2/images/roll20-logo.png?v=2" alt="Roll20 logo" style="" class="withoutad" /> </a> </div> <div class="header-advertisment order-0 order-lg-1 pl-0 pl-lg-4 pl-xl-0 pb-2 pb-lg-0"> <script type='text/javascript'> var googletag = googletag || {}; googletag.cmd = googletag.cmd || []; (function() { var gads = document.createElement('script'); gads.async = true; gads.type = 'text/javascript'; var useSSL = 'https:' == document.location.protocol; gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js'; var node = document.getElementsByTagName('script')[0]; node.parentNode.insertBefore(gads, node); })(); </script> <script type='text/javascript'> googletag.cmd.push(function() { googletag.defineSlot('/34541132/Leaderboard-Compendium', [728, 90], 'dfp-1349444251840-1').addService(googletag.pubads()); googletag.pubads().enableSingleRequest(); googletag.enableServices(); }); </script> <div class="bna" style="max-width: 100%; "> <span class="footer"> <a href="https://app.roll20.net/create-account?bannertext&utm_source=inhouse&utm_medium=banner&utm_campaign=freetextCTA"> Create a free account </a> </span> <div id='dfp-1349444251840-1' style='width:728px; overflow: hidden; height:90px; margin-left: auto; margin-right: auto; max-width: 100%;'> <script type='text/javascript'> googletag.cmd.push(function() { /*$("#dfp-1349444251840-1 a").remove();*/ googletag.display('dfp-1349444251840-1'); }); </script> </div> </div> </div> </div> </div> </div> <div class="header-navbar"> <div class="container"> <nav class="navbar navbar-expand-lg navbar-legacy py-2 py-lg-0"> <button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbar-legacy" aria-controls="navbar-legacy" aria-expanded="false" aria-label="Toggle navigation"> <span class="icon-bar top-bar mt-0"></span> <span class="icon-bar middle-bar"></span> <span class="icon-bar bottom-bar"></span> </button> <div class="collapse navbar-collapse justify-content-between" id="navbar-legacy"> <ul class="navbar-nav"> <li class="nav-item"> <a href="https://app.roll20.net/" class="nav-link" id="menu-play-now">Play Now</a> </li> <li class="nav-item"> <a href="https://app.roll20.net/lfg" class="nav-link" id="menu-join-game">Join a Game</a> </li> <li class="nav-item dropdown mega-dropdown"> <a href="https://marketplace.roll20.net" class="nav-link dropdown-toggle" id="menu-marketplace" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" onClick="navClick('https://marketplace.roll20.net')">Marketplace</a> <ul class="dropdown-menu mega-dropdown-menu" aria-labelledby="menu-marketplace"> <li class="row"> <div class="col-12 col-lg-3"> <div class="mega-menu__links"> <ul class="p-0"> <li> <a href="https://marketplace.roll20.net" class="dropdown-item">What's New</a> </li> <li> <a href="https://marketplace.roll20.net/browse" class="dropdown-item">Browse</a> </li> <li> <a href="https://marketplace.roll20.net/gift/" class="dropdown-item">Give a Gift</a> </li> <li> <a href="https://marketplace.roll20.net/coupon/" class="dropdown-item">Redeem a Code</a> </li> <!-- <li> <a href="https://merchoforr.com/" class="dropdown-item">Merchandise</a> </li> --> </ul> </div> </div> <div class="col-12 col-lg-9 col-xl-9"> <div class="mega-menu__cards pt-3 pt-xl-0 pr-lg-3"> <div class="row"> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://marketplace.roll20.net/browse/bundle/31887/dandd-core-rulebook-bundle-2024"> <span class="sr-only">D&D Core Rulebook Bundle (2024) </span> <img src="https://files.d20.io/marketplace/3970529/F_hjWLAuwz0TkrcIf3BxUw/med.png?1718712581469" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://marketplace.roll20.net/browse/bundle/31887/dandd-core-rulebook-bundle-2024">D&D Core Rulebook Bundle (2024) </a><br/> <span class="card-title">by Wizards of the Coast</span> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://marketplace.roll20.net/browse/bundle/15575/dandd-curse-of-strahd"> <span class="sr-only">D&D Curse of Strahd</span> <img src="https://files.d20.io/marketplace/3977000/dafVzdTIILuozTjInO_vEA/med.png?1719247876490" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://marketplace.roll20.net/browse/bundle/15575/dandd-curse-of-strahd">D&D Curse of Strahd</a><br/> <span class="card-title">by Wizards of the Coast</span> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://marketplace.roll20.net/browse/bundle/29589/pathfinder-core-mega-bundle"> <span class="sr-only">Pathfinder Core Mega Bundle</span> <img src="https://files.d20.io/marketplace/3814843/kr9hNl-iDXGErQDeLyvRdQ/med.png?1709085860170" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://marketplace.roll20.net/browse/bundle/29589/pathfinder-core-mega-bundle">Pathfinder Core Mega Bundle</a><br/> <span class="card-title">by Paizo</span> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://marketplace.roll20.net/browse/bundle/13881/cyberpunk-red"> <span class="sr-only">Cyberpunk RED</span> <img src="https://files.d20.io/marketplace/2804303/qu8j0OPMgC21GjOtNunYzw/med.jpeg?1667917715094" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://marketplace.roll20.net/browse/bundle/13881/cyberpunk-red">Cyberpunk RED</a><br/> <span class="card-title">by R. Talsorian Games</span> </div> </div> </div> </div> </div> </div> </div> </div> </li> </ul> </li> <li class="nav-item dropdown mega-dropdown"> <a href="https://roll20.net/compendium" class="nav-link dropdown-toggle" id="menu-tools" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" onClick="navClick('https://roll20.net/compendium')">Tools</a> <ul class="dropdown-menu mega-dropdown-menu" aria-labelledby="menu-tools"> <li class="row"> <div class="col-12 col-lg-3"> <div class="mega-menu__links"> <ul class="p-0"> <li> <a href="https://roll20.net/compendium" class="dropdown-item">Compendium</a> </li> <li> <a href="https://app.roll20.net/characters" class="dropdown-item">Characters</a> </li> <li> <a href="https://app.roll20.net/audio_library/" class="dropdown-item">Manage Audio</a> </li> <li> <a href="https://app.roll20.net/marker-library" class="dropdown-item">Token Marker Library</a> </li> <li> <a href="https://pages.roll20.net/companionapp" class="dropdown-item">Roll20 Companion App</a> </li> <li> <a href="https://pages.roll20.net/dnd/" class="dropdown-item">D&D Hub</a> </li> <li> <a href="https://pages.roll20.net/marvel-multiverse" class="dropdown-item">Marvel Hub</a> </li> <li> <a href="https://gmhub.roll20.net/" class="dropdown-item">GM Hub</a> </li> <li> <a href="https://dungeonscrawl.com/" class="dropdown-item">Dungeon Scrawl</a> </li> <li> <a href="https://app.demiplane.com/home" class="dropdown-item">Demiplane</a> </li> </ul> </div> </div> <div class="col-12 col-lg-9 col-xl-9"> <div class="mega-menu__cards pt-3 pt-xl-0 pr-lg-3"> <div class="row"> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://app.roll20.net/characters/"> <img src="/images/Roll20Characters-TopNav.jpg" class="card-img-top img-center img-fluid" alt="Tutorial" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://app.roll20.net/characters/">Characters</a> <div class="shorthr"></div> <span class="gameinfo">Create, Manage, and Play Characters</span> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://roll20.net/compendium/"> <img src="/images/banner-compendium.jpg" class="card-img-top img-center img-fluid" alt="Compedium" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://roll20.net/compendium/">Compendium</a> <div class="shorthr"></div> <span class="gameinfo">Your System Come To Life</span> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://app.roll20.net/vault/characters"> <img src="/images/banner-character-vault.jpg" class="card-img-top img-center img-fluid" alt="Character Vault" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://app.roll20.net/vault/characters">Character Vault</a> <div class="shorthr"></div> <span class="gameinfo">Create, Manage, and Play Characters</span> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://dungeonscrawl.com"> <img src="/images/banner-dungeonscrawl.png" class="card-img-top img-center img-fluid" alt="Dungeon Scrawl" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://dungeonscrawl.com">Dungeon Scrawl</a> <div class="shorthr"></div> <span class="gameinfo">Create Maps for your Games</span> </div> </div> </div> </div> </div> </div> </div> </div> </li> </ul> </li> <li class="nav-item dropdown mega-dropdown"> <a href="https://app.roll20.net/forum" class="nav-link dropdown-toggle" role="button" id="menu-community" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" onClick="navClick('https://app.roll20.net/forum')"> Community</a> <ul class="dropdown-menu mega-dropdown-menu" aria-labelledby="menu-community"> <li class="row"> <div class="col-12 col-lg-3"> <div class="mega-menu__links"> <ul class="p-0"> <li> <a href=" https://blog.roll20.net/" class="dropdown-item">Blog</a> </li> <li> <a href="https://roll20.net/help" class="dropdown-item" target="_blank" class="dropdown-item">Help Center</a> </li> <li> <a href="https://roll20.zendesk.com/hc/articles/360037772613-Change-Log" target="_blank" class="dropdown-item">Change Log</a> </li> <li> <a href="https://app.roll20.net/forum/" class="dropdown-item">Forums</a> </li> <li> <a href="https://wiki.roll20.net/Main_Page" class="dropdown-item">Community Wiki</a> </li> <li> <a href="http://www.twitch.tv/roll20app" target="_blank" class="dropdown-item">Live Stream</a> </li> <li> <a href="https://www.youtube.com/channel/UCHC1kWACzA7G6D2fqkqsRDg" target="_blank" class="dropdown-item">VODs</a> </li> <li> <a href="https://pages.roll20.net/ambassador-program" target="_blank" class="dropdown-item">Ambassador Program</a> </li> </ul> </div> </div> <div class="col-12 col-lg-9 col-xl-9"> <div class="mega-menu__cards pt-3 pt-xl-0 pr-lg-3"> <div class="row"> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://blog.roll20.net/posts/the-new-roll20-tabletop-fast-free-and-stunning/"> <span class="sr-only">The New Roll20 Tabletop</span> <img src="https://files.d20.io/images/406055047/NBEegvOJ3pSZYTXXhId6xQ/original.jpg?1724188557376" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://blog.roll20.net/posts/the-new-roll20-tabletop-fast-free-and-stunning/"> The New Roll20 Tabletop </a> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://blog.roll20.net/posts/roll20-discord-activity/"> <span class="sr-only">Play Roll20 on Discord</span> <img src="https://files.d20.io/images/406055142/WxdDedtmZSm7uIUVGANdzg/original.jpg?1724188591159" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://blog.roll20.net/posts/roll20-discord-activity/"> Play Roll20 on Discord </a> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://app.roll20.net/characters/create/dnd2024byroll20"> <span class="sr-only">Play D&D 2024</span> <img src="https://files.d20.io/images/409822399/wtLMqDnqy0jvxjxvOYtaPw/original.jpg?1726541310739" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://app.roll20.net/characters/create/dnd2024byroll20"> Play D&D 2024 </a> </div> </div> </div> </div> </div> <div class="col-12 col-md-6 col-xl-3"> <div class="card mb-3 mb-xl-0"> <div class="row align-items-center"> <div class="col col-xl-12"> <a href="https://blog.roll20.net/posts/roll20-has-acquired-demiplane/"> <span class="sr-only">Demiplane Joins Roll20</span> <img src="https://files.d20.io/images/406056058/6P2sO-_xeNWhbSgKpW7rcw/original.jpg?1724189145614" class="card-img-top img-center img-fluid" alt="" /> </a> </div> <div class="col-8 col-xl-12 pl-2"> <div class="card-body pl-0 px-xl-4 py-0 py-xl-3"> <a href="https://blog.roll20.net/posts/roll20-has-acquired-demiplane/"> Demiplane Joins Roll20 </a> </div> </div> </div> </div> </div> </div> </div> </div> </li> </ul> </li> <li class="nav-item"> <a class="nav-link" href="https://app.roll20.net/why-subscribe-to-roll20" id="nav-subscribe">Subscribe</a> </li> </ul> <ul class="navbar-nav navbar-notifications"> <li class="nav-item dropdown dropdown--click-only no-caret topbarsitenotifications"> <a href="#" class="nav-link nav-icon-only dropdown-toggle" id="menu-site-alerts" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Open Alerts Panel"> <span class="alerts-icon"> <i class="fas fa-bell "></i> </span> </a> <div class="dropdown-menu dropdown-menu-right dropdown-menu--xl py-0" > <div class="list-group list-group-flush"> <div class="list-group sitenotifications"> <a href="https://blog.roll20.net/posts/play-dd-2024-your-way-on-roll20/" class="list-group-item list-group-item-action new"> <div class="d-flex"> <div> <img src="/images/Notification System Icons/social-pink.png" class="mr-3" style="width: 40px; height: 40px;" alt=""> </div> <div> <div class="text-sm lh-150"> <span class="font-weight-bold d-block">New D&D Character Sheet Available</span> <span class="">Roll20's new D&D character sheet, which supports both 2014 and 2024 rules, is live and free for all users.</span> </div> </div> </div> </a> <a href="https://blog.roll20.net/posts/dd-2024-legacy-and-new-character-sheets-unite/#multiplesheets" class="list-group-item list-group-item-action new"> <div class="d-flex"> <div> <img src="https://s3.amazonaws.com/files.d20.io/images/408806657/Cz6McatFyq96_GoqMUDEzw/thumb.png" class="mr-3" style="width: 40px; height: 40px;" alt=""> </div> <div> <div class="text-sm lh-150"> <span class="font-weight-bold d-block">Use Both D&D 5E Character Sheets</span> <span class="">Both classic and new D&D 5E sheets can be used in a single campaign, exclusively in Jumpgate.</span> </div> </div> </div> </a> <a href="https://blog.roll20.net/posts/roll20-tabletop-effects-fx-tool-now-free-for-all-users/" class="list-group-item list-group-item-action new"> <div class="d-flex"> <div> <img src="/images/Notification System Icons/plus-pink.png" class="mr-3" style="width: 40px; height: 40px;" alt=""> </div> <div> <div class="text-sm lh-150"> <span class="font-weight-bold d-block">Effects (FX) Tool Now Free for All! </span> <span class="">Enjoy new and optimized VTT visuals using Project Jumpgate's uplifted Effects tool. </span> </div> </div> </div> </a> <a href="https://app.roll20.net/characters/" class="list-group-item list-group-item-action new"> <div class="d-flex"> <div> <img src="/images/Notification System Icons/social-pink.png" class="mr-3" style="width: 40px; height: 40px;" alt=""> </div> <div> <div class="text-sm lh-150"> <span class="font-weight-bold d-block">Roll20 Characters: D&D + Candela Obscura</span> <span class="">D&D 5E + Candela Obscura sheets are now available in Roll20 Characters to create and manage outside the VTT.</span> </div> </div> </div> </a> </div> </div> <div class="py-2 text-center border-top"> <button id="navbar-notifications__see-more-btn" class="btn btn-link btn-sm text-muted font-weight-bold btn-block">See More</button> </div> </div> </li> <li class="nav-item dropdown dropdown--click-only"> <a href="#" class="nav-link dropdown-toggle" id="menu-signin" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Sign In</a> <div class="dropdown-menu dropdown-menu-right" > <form action="https://app.roll20.net/sessions/create?backto=https://marketplace.roll20.net/browse/search" method="post" class="px-3"> <div class="form-group"> <label for="input_login-email" class="col-form-label-sm m-0">Email address</label> <input type="email" name="email" class="form-control form-control-sm" id="input_login-email" placeholder="email@example.com"> </div> <div class="form-group"> <label for="input_login-password" class="col-form-label-sm m-0">Password</label> <input type="password" name="password" class="form-control form-control-sm" id="input_login-password" placeholder="Password" autocomplete="new-password"> </div> <button type="submit" class="btn btn-primary btn-sm">Sign in</button> </form> <div class="dropdown-divider"></div> <div> <a class="dropdown-item" href="https://app.roll20.net/create-account">New around here? Sign up</a> <a class="dropdown-item" href="https://app.roll20.net/forgot-password">Forgot password?</a> </div> </div> </li> </ul> <ul class="navbar-nav navbar-expanded navbar-notifications navbar-notifications--mobile d-none flex-row"> <li class="nav-item"> <a href="#" class="nav-link nav-icon-only " id="menu-mobile-site-alerts" aria-label="Open Mobile Alerts Menu"> <span class="alerts-icon"> <i class="fas fa-bell"></i> </span> </a> </li> <li class="nav-item"> <a href="https://app.roll20.netlogin" class="nav-link" id="menu-mobile-signin">Sign In</a> </li> </ul> </div> </nav> </div> </div> </header> <div id="mainContent" class="sr-only"></div> <section id="marketplace-masthead" class="masthead-1"> <div class="masthead-inner py-6 py-xl-7 responsive-bg align-bottom align-right" style="background-image: linear-gradient(to left, rgba(0, 0, 0, 0.12), rgba(0, 0, 0, 0.73)), url('https://files.d20.io/images/432639292/Yy-Wm9CI-2cZywuvwt36BQ/original.png?1741881169745" alt="Save up to 25% on D&D!');"> <div class="container"> <div class="row"> <div class="col-lg-6"> <h3 class="display-3 text-white">Save up to 25% on D&D!</h3> <p class=" text-white h5" style="font-weight: normal"> Spring into adventure with these epic deals from Wizards of the Coast. </p> <a href="https://marketplace.roll20.net/browse/search?tag=Unique%20Status:SPRINGDND25" class="btn btn-primary mt-4">Buy Now</a> </div> </div> </div> </div> </section> <section id="marketplace-search" class="pt-4 pb-2"> <div class="container"> <div class="marketplace-search__inner card p-3 m-0"> <div class="row"> <div class="col mr-auto"> <input type="text" id="input__marketplace-search" class="form-control form-control-muted" data-toggle="marketplace-selectize" placeholder="Search Roll20 Marketplace" aria-label="search"> </div> <div class="pr-3 d-inline-block d-lg-none"> <button aria-label="[search_filter]" class="btn btn-outline-dark d-none d-md-inline-block d-lg-none marketplace-search__filter-btn" type="button"><i class="fas fa-sliders-h"></i></a> </div> </div> <div class="collapse marketplace-search__filter-container" id="marketplace-search__filter-container"></div> </div> </div> </section> <section id="marketplace-results-sortby" class="border-bottom shadow-sm py-2"> <div class="container"> <div class="row align-items-center"> <div class="col-12 col-md-3 mr-auto order-3 order-md-0 text-center text-md-left py-3 py-md-0"> <div class="marketplace__result-amount"> <span id="resultnum"></span> Results </div> </div> <div class="col-6 d-block d-md-none order-0"> <a href="javascript:void(0);" class="btn btn-secondary btn-sm marketplace-search__filter-btn">(<span class="number"></span>) Active Filters</a> </div> <div class="col-6 col-md-9 order-2"> <div class="form-inline float-right"> <div class="form-group row align-items-center m-0"> <label for="input_sort" class="m-0 mr-2">Sort By:</label> <select id="input_sort" class="form-control form-control-sm"> <option value="">Relevance</option> <option value="new">Newest</option> <option value="hottest">Hottest</option> <option value="popular">Most Popular</option> <option value="pricelow">Price (Low to High)</option> <option value="pricehigh">Price (High to Low)</option> </select> </div> </div> </div> </div> </div> </section> <section id="main" role="main" class="bg-grayscale4 py-5"> <div class="container"> <div class="marketplace-wrapper d-flex flex-row"> <div class="marketplace-filter-panel__container marketplace-filter-panel--browse"> <div id="marketplace-filter-panel" class="marketplace-filter-panel"> <div class="marketplace-filter-panel__wrapper"> <div class="marketplace-filter-panel__inner-wrapper"> <div class="marketplace-filter-panel__header"> <div class="d-flex align-items-center justify-content-between py-3 px-4"> <div class="marketplace-filter-panel__header-title h6 m-0">Filters</div> <a href="JavaScript:void(0)" id="marketplace-filter-panel__header-clear" class="marketplace-filter-panel__header-clear">Clear All</a> <a href="JavaScript:void(0)" id="marketplace-filter-panel__header-close" class="marketplace-filter-panel__header-close" aria-label="Close"><i class="fal fa-times"></i></a> </div> <div class="marketplace-filter-panel__active-filters py-3 px-4 bg-gray-100"> </div> <div class="marketplace-filter-panel__active-filters-clear-container text-right px-4 pb-3 bg-gray-100"> <a href="JavaScript:void(0)" id="marketplace-filter-panel__active-filters-clear" class="marketplace-filter-panel__active-filters-clear">Clear All (<span class="number"></span>)</a> </div> </div> <div class="marketplace-filter-panel__body"> <div id="accordion-1" class="accordion accordion-stacked"> <div class="card-header py-3" data-toggle="collapse" role="button" data-target="#collapseCategory-art" aria-expanded="true" aria-controls="collapseCategory-art"> <h6 class="mb-0">Art</h6> </div> <div id="collapseCategory-art" class="collapse show" aria-labelledby="collapseCategory-art"> <div class="card-body p-0"> <div class="pt-3 px-4 filter-body--category"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-art" data-filter="Art" data-parent="itemtype" /> <label class="custom-control-label" for="checkbox_filter-all-art">All Art</label> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-art-tokens" aria-expanded="false" aria-controls="collapseCategory-art-tokens"> <h6 class="mb-0 font-weight-normal">Tokens</h6> </div> <div id="collapseCategory-art-tokens" class="collapse" aria-labelledby="collapseCategory-art-tokens"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-tokens" data-filter="Tokens" data-parent="Art" /> <label class="custom-control-label" for="checkbox_filter-all-tokens">All Tokens</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-figures" data-filter="Figures" data-parent="Tokens"/> <label class="custom-control-label" for="checkbox_filter-figures">Figures</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-borderedtokens" data-filter="Bordered Tokens" data-parent="Tokens"/> <label class="custom-control-label" for="checkbox_filter-borderedtokens">Bordered Tokens</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-portraits" data-filter="Portraits" data-parent="Tokens"/> <label class="custom-control-label" for="checkbox_filter-portraits">Portraits</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-tokenelements" data-filter="Token Elements" data-parent="Tokens"/> <label class="custom-control-label" for="checkbox_filter-tokenelements">Token Elements</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-statusicons" data-filter="Status Icons" data-parent="Tokens"/> <label class="custom-control-label" for="checkbox_filter-statusicons">Status Icons</label> </div> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-art-maps" aria-expanded="false" aria-controls="collapseCategory-art-maps"> <h6 class="mb-0 font-weight-normal">Maps</h6> </div> <div id="collapseCategory-art-maps" class="collapse" aria-labelledby="collapseCategory-art-maps"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-maps" data-filter="Maps" data-parent="Art" /> <label class="custom-control-label" for="checkbox_filter-all-maps">All Maps</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-tilesets" data-filter="Tile Sets" data-parent="Maps"/> <label class="custom-control-label" for="checkbox_filter-tilesets">Tile Sets</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-mappacks" data-filter="Map Packs" data-parent="Maps"/> <label class="custom-control-label" for="checkbox_filter-mappacks">Map Packs</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-worldmaps" data-filter="World Maps" data-parent="Maps"/> <label class="custom-control-label" for="checkbox_filter-worldmaps">World Maps</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-dynamicallylitmaps" data-filter="Dynamically Lit Maps" data-parent="Maps"/> <label class="custom-control-label" for="checkbox_filter-dynamicallylitmaps">Dynamically Lit Maps</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-dashboards" data-filter="Dashboards" data-parent="Maps"/> <label class="custom-control-label" for="checkbox_filter-dashboards">Dashboards</label> </div> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-art-tokenmarkers" aria-expanded="false" aria-controls="collapseCategory-art-tokenmarkers"> <h6 class="mb-0 font-weight-normal">Token Markers</h6> </div> <div id="collapseCategory-art-tokenmarkers" class="collapse" aria-labelledby="collapseCategory-art-tokenmarkers"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-tokenmarkers" data-filter="Token Markers" data-parent="Art" /> <label class="custom-control-label" for="checkbox_filter-all-tokenmarkers">All Token Markers</label> </div> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-art-objects" aria-expanded="false" aria-controls="collapseCategory-art-objects"> <h6 class="mb-0 font-weight-normal">Objects</h6> </div> <div id="collapseCategory-art-objects" class="collapse" aria-labelledby="collapseCategory-art-objects"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-objects" data-filter="Objects" data-parent="Art" /> <label class="custom-control-label" for="checkbox_filter-all-objects">All Objects</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-structures" data-filter="Structures" data-parent="Objects"/> <label class="custom-control-label" for="checkbox_filter-structures">Structures</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-nature" data-filter="Nature" data-parent="Objects"/> <label class="custom-control-label" for="checkbox_filter-nature">Nature</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-inventory" data-filter="Inventory" data-parent="Objects"/> <label class="custom-control-label" for="checkbox_filter-inventory">Inventory</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-decor" data-filter="Decor" data-parent="Objects"/> <label class="custom-control-label" for="checkbox_filter-decor">Decor</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-mapmarkers" data-filter="Map Markers" data-parent="Objects"/> <label class="custom-control-label" for="checkbox_filter-mapmarkers">Map Markers</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-magiceffects" data-filter="Magic & Effects" data-parent="Objects"/> <label class="custom-control-label" for="checkbox_filter-magiceffects">Magic & Effects</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-vehicles" data-filter="Vehicles" data-parent="Objects"/> <label class="custom-control-label" for="checkbox_filter-vehicles">Vehicles</label> </div> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-art-weather" aria-expanded="false" aria-controls="collapseCategory-art-weather"> <h6 class="mb-0 font-weight-normal">Weather</h6> </div> <div id="collapseCategory-art-weather" class="collapse" aria-labelledby="collapseCategory-art-weather"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-weather" data-filter="Weather" data-parent="Art" /> <label class="custom-control-label" for="checkbox_filter-all-weather">All Weather</label> </div> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-art-music" aria-expanded="false" aria-controls="collapseCategory-art-music"> <h6 class="mb-0 font-weight-normal">Music</h6> </div> <div id="collapseCategory-art-music" class="collapse" aria-labelledby="collapseCategory-art-music"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-music" data-filter="Music" data-parent="Art" /> <label class="custom-control-label" for="checkbox_filter-all-music">All Music</label> </div> </div> </div> </div> </div> <div class="card-header py-3" data-toggle="collapse" role="button" data-target="#collapseCategory-games" aria-expanded="true" aria-controls="collapseCategory-games"> <h6 class="mb-0">Games</h6> </div> <div id="collapseCategory-games" class="collapse show" aria-labelledby="collapseCategory-games"> <div class="card-body p-0"> <div class="pt-3 px-4 filter-body--category"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-games" data-filter="Games" data-parent="itemtype" /> <label class="custom-control-label" for="checkbox_filter-all-games">All Games</label> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-games-rpgrulebooks" aria-expanded="false" aria-controls="collapseCategory-games-rpgrulebooks"> <h6 class="mb-0 font-weight-normal">RPG Rulebooks</h6> </div> <div id="collapseCategory-games-rpgrulebooks" class="collapse" aria-labelledby="collapseCategory-games-rpgrulebooks"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-rpgrulebooks" data-filter="RPG Rulebooks" data-parent="Games" /> <label class="custom-control-label" for="checkbox_filter-all-rpgrulebooks">All RPG Rulebooks</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-coregames" data-filter="Core Games" data-parent="RPG Rulebooks"/> <label class="custom-control-label" for="checkbox_filter-coregames">Core Games</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-bestiaries" data-filter="Bestiaries" data-parent="RPG Rulebooks"/> <label class="custom-control-label" for="checkbox_filter-bestiaries">Bestiaries</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-rulesexpansions" data-filter="Rules Expansions" data-parent="RPG Rulebooks"/> <label class="custom-control-label" for="checkbox_filter-rulesexpansions">Rules Expansions</label> </div> <div class="card-header py-3 mx-n4 card-header--level2" data-toggle="collapse" role="button" data-target="#collapseCategory-games-rpgrulebooks-addons" aria-expanded="false" aria-controls="collapseCategory-games-rpgrulebooks-addons"> <h6 class="mb-0 font-weight-normal">Addons</h6> </div> <div id="collapseCategory-games-rpgrulebooks" class="collapse" aria-labelledby="collapseCategory-games-rpgrulebooks"> <div id="collapseCategory-games-rpgrulebooks-addons" class="collapse" aria-labelledby="collapseCategory-games-rpgrulebooks-addons"> <div class="pt-3 px-4 filter-body--level2"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-addons" data-filter="Addons" data-parent="RPG Rulebooks"/> <label class="custom-control-label" for="checkbox_filter-all-addons">All Addons</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-characters" data-filter="Characters" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-characters">Characters</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-monsters" data-filter="Monsters" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-monsters">Monsters</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-items" data-filter="Items" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-items">Items</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-locations" data-filter="Locations" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-locations">Locations</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-effects" data-filter="Effects" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-effects">Effects</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-ideaprompts" data-filter="Idea Prompts" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-ideaprompts">Idea Prompts</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-puzzles" data-filter="Puzzles" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-puzzles">Puzzles</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-playaids" data-filter="Play Aids" data-parent="Addons"/> <label class="custom-control-label" for="checkbox_filter-playaids">Play Aids</label> </div> </div> </div> </div> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-games-adventures" aria-expanded="false" aria-controls="collapseCategory-games-adventures"> <h6 class="mb-0 font-weight-normal">Adventures</h6> </div> <div id="collapseCategory-games-adventures" class="collapse" aria-labelledby="collapseCategory-games-adventures"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-adventures" data-filter="Adventures" data-parent="Games" /> <label class="custom-control-label" for="checkbox_filter-all-adventures">All Adventures</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-oneshots" data-filter="One Shots" data-parent="Adventures"/> <label class="custom-control-label" for="checkbox_filter-oneshots">One Shots</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-shortcampaigns" data-filter="Short Campaigns" data-parent="Adventures"/> <label class="custom-control-label" for="checkbox_filter-shortcampaigns">Short Campaigns</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-longcampaigns" data-filter="Long Campaigns" data-parent="Adventures"/> <label class="custom-control-label" for="checkbox_filter-longcampaigns">Long Campaigns</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-quickstart" data-filter="Quickstart" data-parent="Adventures"/> <label class="custom-control-label" for="checkbox_filter-quickstart">Quickstart</label> </div> </div> </div> <div class="card-header py-3 card-header--level1" data-toggle="collapse" role="button" data-target="#collapseCategory-games-boardcardgames" aria-expanded="false" aria-controls="collapseCategory-games-boardcardgames"> <h6 class="mb-0 font-weight-normal">Board & Card Games</h6> </div> <div id="collapseCategory-games-boardcardgames" class="collapse" aria-labelledby="collapseCategory-games-boardcardgames"> <div class="pt-3 px-4 filter-body--level1"> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-all-boardcardgames" data-filter="Board & Card Games" data-parent="Games" /> <label class="custom-control-label" for="checkbox_filter-all-boardcardgames">All Board & Card Games</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-classic" data-filter="Classic" data-parent="Board & Card Games"/> <label class="custom-control-label" for="checkbox_filter-classic">Classic</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-strategy" data-filter="Strategy" data-parent="Board & Card Games"/> <label class="custom-control-label" for="checkbox_filter-strategy">Strategy</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-party" data-filter="Party" data-parent="Board & Card Games"/> <label class="custom-control-label" for="checkbox_filter-party">Party</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-family" data-filter="Family" data-parent="Board & Card Games"/> <label class="custom-control-label" for="checkbox_filter-family">Family</label> </div> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="checkbox_filter-carddecks" data-filter="Card Decks" data-parent="Board & Card Games"/> <label class="custom-control-label" for="checkbox_filter-carddecks">Card Decks</label> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="marketplace-filter-panel__footer px-4"> <button type="button" id="marketplace-filter-panel__search-btn" class="btn btn-primary marketplace-filter-panel__search-btn">Search</button> </div> </div> </div> <div id="marketplace-content" class="marketplace-content"> <div class="marketplace-content__wrapper"> </div> </div> </div> </div> </section> <section id="marketplace-pagination" class="marketplace-pagination bg-transparent py-3"> <div class="container"> <nav aria-label="Marketplace Pagination"> <ul class="pagination justify-content-center"> <li class="page-item" id="firstPageButton" data-page="1"><a class="page-link" href="JavaScript:void(0)" aria-label="First">First</a></li> <li class="page-item" id="previousPageButton"><a class="page-link" href="JavaScript:void(0)" aria-label="Previous">Previous</a></li> <span class="px-2 d-inline-block align-self-center">Page <span id="currentpage"></span>/<span id="lastpage"></span></span> <li class="page-item" id="nextPageButton"><a class="page-link" href="JavaScript:void(0)" aria-label="Next">Next</a></li> <li class="page-item" id="lastPageButton"><a class="page-link" href="JavaScript:void(0)" aria-label="Last">Last</a></li> </ul> </nav> </div> </section> <div class="body-overlay"></div> <div class="modal fade" id="createNewWishlistModal" tabindex="-1" role="dialog" aria-hidden="true" class="createNewWishlistModal"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="createNewWishlistModalLabel" style="display: inline;">Create New Wishlist</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <form action="/wishlist/create" method="post" autocomplete="off"> <div class="modal-body"> <div class="row align-items-center"> <div class="col-12 col-xs-12"> <div class="form-group"> <label class="form-control-label" for="wishlist-name">Wishlist Name</label> <input type="text" name="name" class="form-control form-control-sm" id="wishlist-name" autocomplete="off" required> <input type="hidden" value="" name="accountid"> <input type="hidden" value="" name="itemid"> </div> </div> <div class="col-12 col-xs-12"> <div class="custom-control custom-radio custom-control-inline radio-inline"> <input type="radio" id="radio_public" value="public" name="public" checked class="custom-control-input"> <label class="custom-control-label" for="radio_public">Public</label> </div> <div class="custom-control custom-radio custom-control-inline radio-inline"> <input type="radio" id="radio_privacy" value="private" name="public" class="custom-control-input"> <label class="custom-control-label" for="radio_privacy">Private</label> </div> <div class="small privacyMessage">Other people can view this list.</div> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-light btn-sm btn-inner--text" data-dismiss="modal">Cancel</button> <button type="submit" class="btn btn-primary btn-sm submit btn-inner--text">Create Wishlist</button> </div> </form> </div> </div> </div> <div class="modal fade" id="editWishlistModal" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="editWishlistModalLabel">Edit</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <form action="/wishlist/update" method="post"> <div class="modal-body"> <div class="row align-items-center"> <div class="col-12"> <div class="form-group"> <label class="form-control-label" for="input_edit_name">Wishlist Name</label> <input type="text" name="name" class="form-control form-control-sm" id="input_edit_name" required> <input type="hidden" value="" name="accountid"> <input type="hidden" value="" name="id"> </div> </div> <div class="col-12"> <div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="radio_edit_public" value="public" name="public" checked class="custom-control-input"> <label class="custom-control-label" for="radio_edit_public">Public</label> </div> <div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="radio_edit_privacy" value="private" name="public" class="custom-control-input"> <label class="custom-control-label" for="radio_edit_privacy">Private</label> </div> <div class="small privacyMessage">Other people can view this list.</div> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-light btn-sm btn-inner--text" data-dismiss="modal">Cancel</button> <button type="submit" class="btn btn-primary btn-sm submit btn-inner--text">Submit Changes</button> </div> </form> </div> </div> </div> <script type="text/javascript"> $("a.createwishlist").on("click", function(){ let itemid = $(this).parents("[data-itemid]").data("itemid"); if(itemid) { $("#createNewWishlistModal input[name=itemid]").val(itemid); } }); $('.modal-content form input[type=radio][name=public]').change(function() { var publicmessage = "Other people can view this list." var privatemessage = "Only you can view this list." switch ($('input[name=public]:checked').val()) { case 'public': $('.privacyMessage').text(publicmessage); break; case 'private': $('.privacyMessage').text(privatemessage); break; }; }); $(".wishlist-action__delete").on("click", function() { let wishlistid = $(".wishlist-dropdown-item.active").data("id"); let deleteChoice = confirm(`Are you sure you want to delete this wishlist?`); if(deleteChoice) { $.post('/wishlist/deletewishlist/', { wishlistid: wishlistid }, function(data) { window.location = `/wishlists/`; }); } }); $(".wishlist-action__edit").on("click", function(){ $("#editWishlistModal").modal('show'); }); $(".wishlist__view").on("click", ".wishlist-action__remove", function() { let itemid = $(this).parents(".card-product").data("itemid"); let listid = $(".wishlist-dropdown-item.active").data("id"); $.post('/wishlist/removeitem', { itemid: itemid, listid: listid }, function(data) { showItems(JSON.parse(data)); }); }); </script> <script type="text/javascript"> // Needed for RB to JS bridge. var $masthead_url = "https://marketplace.roll20.net/browse/search?tag=Unique%20Status:SPRINGDND25"; var $authorlist = ["0-hr", "1,000 Creations", "100DOS", "1985 Games", "2 Dead Pixels", "2-Minute Tabletop", "20 Sided Maps", "2D Storyteller", "2OG Games", "9th Level Games", "a day at - modular modern maps", "A.E. Coggon", "Aaron Hendricks", "Aaron Z. Arrick", "AAW Games", "Abandon", "Abel Blakk's Monsters and Maps", "Abelhawk", "Abyssal Brews", "Acheaa", "Acheron Games", "Ada Lindberg", "Adam Bell", "Adam F", "Adder B", "Adela Quiles", "Advanced Battlemaps", "Adventure Awaits Battlemaps", "Adventure Hoard", "Adventure Inc.", "Aegis Studios", "AEIO Utopia", "Aenarion's Coven", "Aetheric Dreams", "AetherPress", "Airëcemi Maps", "Alec Thomas", "Aleksandr Filinkov", "Alex Carmichal", "Alex Green", "Alexandre Menet", "AlexTheMapMaker", "Algen summons", "Alka-Di-Kijarr", "Allen Rees", "Alligator Alley Entertainment", "Almeow", "Alpha Strike Games Ltd", "Alyssa Faden", "Amatsu", "Amazing Rando Design", "Amber Dawn Games", "Ambitosis", "Ame Kuma Maps", "AmmyArts ", "Ancestral Dawn", "Ancris IT", "Andrew Chirgwin", "Andrew James Woodyard", "Andrews McMeel Publishing", "Andy Gerding", "Andy Owlington", "Angela Maps", "Animancer", "Animancy Press", "Anosina", "Anthony Jones", "Antonino Liconti", "Anzhc", "AquaSpiderArt", "Arc Dream Publishing", "Arc Le Joan", "Arcadia's Creations", "Arcadian Media", "Arcana Games", "Arcane Affinity", "Arcane Minis", "Arcane Vault Assembly", "Arcania Adventures", "Arcanum Syndicate", "Arcanum Worlds", "Architect GM", "Arcknight", "Arion´s Humble Map Shop", "Arkangel", "Arlin Ortiz", "Arme Blanche Games", "Armored Studio", "Art Arcanum", "Art of Amanda NP", "Artem", "Artem Grishin", "Artful Serge, LLC", "ArtifexMaps", "artmikegarcia", "Ashen Realms", "AshLands Maps", "AsTheMagpieFlies", "AtaraxianBear", "Atelier Tillumni", "AtomicTitan", "Austin Little", "Austin Ramsay Games", "Avalanche Artistry", "Avery Alder", "Avner's Games", "AWinterBlaze TTRPG Resources", "Axostories", "Aymber Prefabs", "Azu", "Azulity", "B. Simon Smith", "B.A. Games", "Backwards Tabletop", "Balefire Creations", "Bambi1991", "Bandit Camp", "BanzaiZAP Map Packs", "Barbes", "Barkada Games", "Barto", "Bartolius", "Baufroy", "BC Games", "Bearworks", "BeatrixRae Cartography", "Beetroot McKinnley", "Bellow", "Bells Does RPGs", "Ben Johnson", "BenDjinn Games", "Beneos Battlemaps", "Benjamin Ilarraza", "BFH Tokens", "BGHookeArt", "BigGuy", "Billy Blue", "BirdBean Press", "Black Armada Games", "Black Belt Maps", "Black Blue Woof", "Black Void Games", "BlackLilithMoon", "Blackraven Studios", "BlackSmithArt", "Blacktris Tavern", "Blackwood Workshop", "Blue Crab Party", "Blue Raven Treasures", "Blueberrymaps", "Bob A.", "Bold Brush Studio", "Borough Bound", "Brandon Cook", "Brass Badger Workshop", "Brave New Worlds", "Braythe RPG", "Brian Wise", "Brotherwise Games", "brushmen", "Buguwa", "Bully Pulpit Games", "Burning Wheel", "Burrows RPG Worlds", "Buttonpusher Studios", "By Jove Publishing", "Bytewerks", "Caeora", "Calistocrates Mapventures", "Campside Tales", "Candle Moth Stories", "Candlelight Entertainment", "Cannon's Maps", "Canvas Quest", "Caramujo's Corner", "Cards Will Tell Productions", "Carl Jackman", "Carnival 6 Studio", "Cartographer's Cantrip", "Caseymobile", "Cassastereo's Mapperie", "Cast n Play", "Castle Clark Games", "Cat Guardian Illustrations", "Catalyst Game Labs", "Catilus", "Cauldron of Challenges", "Cave Geek Maps", "Cecilia Kjellman", "Chamomile Has Adventures", "Chaosium Inc.", "Charly Bellavance", "Chee Seekins", "Cheyenne Wright", "Chibbin Grove", "Chris Boe", "ChrisMephamRPG", "Christian Truog", "Cinderlight Studio", "Clark S.", "Clint Bohaty", "Cloud-Yo!", "Colin Richards", "Columbia Games", "Cone Of Negative Energy", "Corefun Studios", "CornyMaps", "Corradine's Maps", "Cory McD", "Cosmicmaps", "Coyote & Crow", "coyotegrey", "Crafty Ogre", "Create & Serve", "Creative Witch", "Creature Curation", "Creature Forge", "CRISPR Monkey Studios", "Crit Hit Brit", "CritCartograph", "Critical Concepts", "Critical Crafting", "Critical Realms", "Critical Tavern", "CrossF", "Crosshead", "Cryptocartographer", "Cthulhu Architect", "Cthulhu Reborn", "Cubicle 7 Entertainment", "cupidbeaux", "CyberWyld", "CyborgPrime Games", "Cyclopean", "Cyrens Maps", "Czepeku", "CZRPG", "Cédric H.", "D&Demetrius' Maps", "D20 Epic Level", "d20_dragon", "d20Monkey", "D20Nomads", "Dakota N.", "Dakota Nicholas", "Daltown Tabletop Creations", "Damage Die Jim", "Dan DiPietro", "Dan Heinrich", "Danger Vault", "Daniel \"SDM\" Reis", "Daniel 'SDM' Reis", "Daniel Bayless", "Daniel R.", "Daniel Rosenblatt", "Daniel Salcido", "Daniel's Maps", "Danilo Zaki", "Danima Gaming", "Dark Lord Dice", "DarkDeer", "Darker Hue Studios", "Darkloli", "Darkseal", "Darn Old Art", "Darrington Press", "Dave's Art Tavern", "David Baldridge", "David Hemenway", "David Kogan", "David Miller", "David North", "David Silver", "David's Ballarat Gamers", "David's Consortium", "Dawn Caroll", "Dawn Carroll", "Daydream Archives", "de-Zigner", "Deadworks Alliance", "Dean Spencer Art", "Deathly", "DeekLeeshy Maps", "Deep Water Games", "DeepDark Designs", "Deeper Dungeons", "Defrin's Emporium", "Dejexl", "Delgar", "DeMartini Designs", "Demon Paimon", "Deruji", "Deven Rue", "Devin Night", "Devious Designs", "DevoursBears", "Diantimony Designs", "Dice Chronicles", "Dice Grimorium", "DigitalTTRPG ", "Dimension 20", "Dimension Dorks", "Divination Illustrations", "DM Andy Maps", "DM Anubis", "DM Cucub", "Dm Flint", "DM Nel", "DM Todd Bloom", "DMDave", "DMPat", "DMS Creations", "DnDadmog", "DnDPlay20", "DnDPlay20 Games", "Doc", "Doffu", "Domigorgon's Maps", "Domille", "Domille's Wondrous Works", "Domino44maps", "Doodelish", "Doodles and Dragons", "Dr. Mapzo", "Dragon Drop Gaming", "Dragonix Books", "Dragonshorn Studios", "dransky", "Dread Maps", "Dream Realm Storytellers", "Drew Soman", "DrX", "Dsurion", "DumbHumanDrawn", "Dump Stat Adventures", "Duncan", "Dungeon Baker", "Dungeon Channel", "Dungeon Doug Maps", "Dungeon Journal", "Dungeon Master Tuz", "Dungeon Mister's Menagerie of Misadventures", "Dungeon Rogues", "Dungeon Scribe", "Dungeon Shorts", "Dungeon Smith", "Dungeon Strugglers", "dungeonism", "Dungeonmapster", "DungeonMartian", "DungeonPaws", "Dungeons on a Dime", "DuskWolf", "Dusky Cat", "Dusty's Nexus", "DutyUntoDeath", "Dwarven Pigeon", "Dylan Grinder", "e.r. norman", "E.R. Norman", "Echo ", "Edge Studio", "Edward Castle", "EGGtOkens", "Eglay", "Eightfold Paper", "El Alebrije Itinerante", "Elcio Trombini", "Elderbrain", "Eldritch Arcanum", "Eledryll Maps", "Elemental Flame", "Elena N.", "Eli Moon", "Elite Adventures Inc.", "Eloquin", "Elton's Fantastic Workshop", "Eluut_bazaar", "Elven Tower Adventures", "Elyrian Dreams", "Em the Game Master", "EN Publishing", "Entanglement Interactive LLC", "EnthusiasmShared", "Epic Quest Productions", "Epsilon7430", "Erdrik", "Ergo's Emporium", "Erian Dragonborn", "Erisia", "Escape Plan Games", "Essendi", "Estudio Tlalocán", "Eternal_Savvy", "Ethan Calabria", "Ethan Hudgens", "ETW Games", "Eugene's Workshop", "Euphamia", "Eventyr Games", "Evernorth S&E", "Every Map A Story ", "Eveydeetart", "Evil Genius Games", "Evil Hat Productions", "Fabio Semenzato", "Fabled Sirens", "FableKit", "Falconforgefantasy", "Fantastical Cartographers", "Fantasy Atlas", "Fantasy Forgeworks", "Fantasy Salad", "FantasyRollDice", "Faraday", "Farwin Fantasy", "FASA Games", "Fearsome Foes", "Felipe S. Silva", "Fernando Alves", "Fiendslayer Games", "Fire Hand Studios", "First Adventures", "Fishbowl Kraken", "Fisktak", "Force of Virtue", "Forge of Tlepsh", "Forge Universe Blacksmith Labs Ltd.", "ForgeMaster's Workshop", "Forgotten Adventures", "Forrest Imel", "FragMaps", "Fred Lang", "Free League Publishing", "Frida Bergholtz", "Fridge's Fancy Battle Maps", "FriendOrFoe", "Frik", "Frog God Games", "frogfairy", "From The Ashes", "From the Ashes", "FrozenApples Studio", "Fungeon Master", "G. Romilly Mueller", "Gabe Hicks", "Gabriel Pickard", "Gadfly Games", "GalefireRPG", "GalefireRPG ", "Gallant Knight Enterprises", "Game Tile Warehouse", "Game to Grow", "GameBrink Studios", "Gamers Cortex", "Gary Simpson", "Gear Games", "Gemhammer and Sons", "Ghostfire Gaming", "Ginnos-Maps", "Glargh", "GM Puppy Pound", "GM's Tavern", "Gnomio's", "GoAdventureMaps", "Goatwright", "GonerogueArtUK", "Goodman Games", "Gooey Cube", "Grae Hunter", "Grantovich", "GreaterFishy", "Greckels Grimoires", "Greek4Six", "Green Feather Games", "Green Ronin Publishing", "Greg Bruni", "Greg Taylor", "Greg Taylor Art", "GreyScriber", "Griffin Peak Productions", "Grim Maven", "Grim Press", "GRIPNR Presents - The Glimmering", "Grumpy Kobold", "Guild Chronicles, LLC", "Guilherme Geri", "guttDesign", "Haasio", "Haigo Dungeoncrafts", "Hank at the Raid N Trade", "Happy Monster Press", "Harbinger's Wares", "Harley Smith", "Hazel's Emporium", "heart of the deernicorn", "Hector Cornejo", "Heiph Illustrates", "Helm's Fables", "Henry Martinez", "HERO Games", "Hero Smith", "Heroes of Karth", "Heroes of the Coast", "Heroic Maps", "Heroic Roleplaying Press", "Heyra! Isometric Maps", "Hi De Ho Games", "Hideous Hiss", "High Fantasy", "Hiscursedness", "HiSS-Graphics", "Hit Point Press", "Hitdice", "Hoenir", "HollyAndThorn", "HoloGrounds", "HoloHeroes Next", "HOMIEandTheDUDE", "House Lawlez", "Hunters Entertainment", "Hushicho", "Ian Brock", "IdrisTheGoblin", "iec", "Ilgo Art", "Illo-Tokens", "Illustrated Page Design", "Impossible Emporium", "Indi Martin - Tortoise & Hare Creations", "Ink and Bone", "Inkwell Ideas", "Inn Scribe Maps", "Inocyde Worldsbuilder", "Inspiring R.P.G", "Iron Crown Enterprises", "Iron GM Games", "Ironstone Press", "Isidoro Campaña", "IsItMyTurnYet", "IsoAdventures", "Isometric Worlds", "J R Evans", "J. Rodriguez", "J.Baptista", "J.Dixon Studio", "JackieCoY", "Jacopo Sabbadini", "Jake's VTT Tokens+Maps", "Jambô Editora", "James Hastings", "James Introcaso", "James Nathaniel", "Jameson Scott", "JamesRPGArt", "Jan Loos", "Jared Blando", "Jason Beighel", "Jason Butera", "Jason Heath", "Jason Kerr", "Jason Kogan", "Jay Westcott", "Jaytaro", "Jazz-Dude", "JB-Media", "Jean Adaser", "Jeff Mahony", "Jeff Stevens Games", "Jeffrey Chen", "Jeffrey Kaminski", "Jenafer Cruz", "Jeremy Wynn", "Jesse Butler", "Jesse Lane", "Jesús Navarro", "JJPS", "Joe Bush", "Joel Marcantel", "Joel Steudler", "John Latta Art", "John Schneddi", "John Youngeagle", "Jon Brazer Enterprises", "Jonann", "Jonathan Elliott", "Jonathan Llewellyn", "Jonathan Roberts", "Jonathan Scott", "Joseph Blanchette", "Joseph Fox's BinderStuff", "Juicy", "Julien De Lucca", "JurianChibo", "Justin Highberger", "Justin Lewis", "Justin Morison", "JVNKCAT", "Kaigen87", "Kaitelyn Toft", "Kaiz Rift Games", "KamuiHand", "Kaney Kreative", "Karma Pirate Games", "Kasrelain", "Katalabus Maps", "katorga.art", "KC Rift", "KDCMArts", "Keegan", "Keith Curtis", "Keith Reinig", "Kelfecil's Tales", "Kelly Whyte", "Keltic Studio", "Kernel Knight's Atlas", "Kevin Berry", "Kevin Brown", "Kevin Campbell", "KevinDnG", "Kidney Boy", "Kiel Thompson", "Kieran H", "Kim's fantasy assets", "Kirizaki", "Kishi", "Kiwisusu", "KJJ Publications", "Klaus Gieseler", "Klawzie", "Klone #29", "KnightKingS", "Knights of Vasteel", "Kobold Press", "Kodiak", "Konigstein Homebrews", "KosMaps", "Kraven’s Keep", "Kristin Carlson", "KriszDoodle", "Kyle Adair", "Kyle Armstrong", "Kyle De Young", "Kyle White", "Kytah Art", "L'Endimanché", "La Regina MAB", "Laerso Ramos", "Larry Roberts", "Lazarus the Cartographer", "LazyTrain", "LBM Mapmaker", "Lee Lockwood", "Lee0z", "Legendary Adventure Press", "Legendary Games", "Legends of Athelu", "Les Contes de Zak", "Lesha’s Illustrations", "Levi Lord", "Liam Davey", "Lichbrush", "Lighthouse Keeper Games", "Limberlost Studio", "Limithron", "Linden Games", "LinouMajorZero", "Lion Banner Games", "Living Tokens", "LivingDungeons", "Lodaim's Tokens", "Lohikaarmes", "Loke BattleMats", "Lone Colossus Games", "Lone Mapper", "Lookstone", "Looney Labs", "Loot Tavern", "Lord Stendor", "Lord Taylorian", "Lords of Gallipae Games LLC", "Loremasters", "Lorestone Maps", "Lorien Wright", "Lost Acumen", "Lost West Media", "Louis Porter Jr Design", "Lucas Dotte Art", "LuckyFox Tabletop", "Lueliya", "LunaBear Games", "LunaryNeko", "Lupen The Wolf", "M. Bittencourt", "Mac Beddy", "Mace Publishing Ltd", "Mad Sparrow", "Mad World", "Madgarou's Bazaar", "Mage Hand Press", "Magog's Maps", "Magpie Games", "Malefactory Games", "Mammoth Factory", "Manearoliste", "Manseyful", "Many Maps", "Map Crow", "Map Doctor", "Map Hatchery", "Map Masters", "MapGuffin", "MapLocks", "Mapmaster Battlemaps", "Mappith", "Maps 'N' Quests", "Maps 'n' Role", "Maps by Rainbow Danger", "MapSmyth", "MapXilla", "MargoMods", "Marion Poinsot", "Mark Cashion", "Mark Stern", "MarkDrummondJ", "Mars the Bard", "Martin Pedersen", "Marvel", "Master Maps", "Mat Kolbeck", "Mathias B.", "Mathias Berben", "Mats Svendsen", "Matt Pierce", "Matt Sinor", "Matt Ward", "Matt Warwick", "Matt.M Animations", "Mattecoo", "Matther", "Matthew Foss", "Matthew Ritter", "Matthew Whalley", "MavHatter Laboratories", "Max Dunham", "Max Marsh", "Max Rinkel", "Maxwell Taylor", "MCDM Productions", "McFin Artwork", "McKenna M", "McNabb Games LLC", "Meditating Munky", "Meepo", "mei-chuan-nei-ku", "Melanie Paterson", "Menagerie Press", "MicahDraws", "Michael Centala", "Michael Fitzhywel", "Michael Turney", "Michelle Ribar", "MicMap", "Micmaps", "Midgard Gaming Studios", "Midgardia", "Midnite Oil Games", "Mik Holmes", "Mikiko", "MildMisanthropy", "Milestone", "Mimee", "Mini Mayhem & Manufacturing", "MiniMinions", "Mink", "Minotaur Games", "Minotravos Maps", "Mirror Images", "Miscellanea Maps", "MischievousMaps", "Misjay Maps", "Miska’s Maps", "Mister Ferv's Market", "Mizu", "MK online services", "MMPapps Corp.", "Moandor", "Modemkiller", "Modiphius Entertainment", "Modular Dungeon Craft", "Mollicart", "Momentous Maps", "Mongoose Publishing", "Monkey's Tavern", "MonkeyB’s Toybox", "MonkeyDM", "Monnichi Art", "Monsieur Gentil", "Monster Grin", "Monster Mage Games", "Monte Cook Games", "Moon Gate Exploration Co.", "Moonlight Maps", "Moonlight Maps SciFi", "Moosanychibis", "Morgan Richard", "Moriah Ortiz", "Mortar and Thistle", "Morvold Press", "Mountainland Games", "Moving Dungeons", "MrCrowleyTTRPG", "MrDrButthurt", "MrValor", "MysticalMaps", "Mythic Portal Games", "naguikunrpg", "Nailcoffin Media", "Nailmaker", "Namadozer", "Narradores Narrados", "Nate's Map Emporium", "Nathan Smith", "Nathaniel D.", "Nathaniel Dorrington", "Naughty Zoot", "Nerdarchy", "NerdBurger Games", "Nerdy Maps", "Nerx Maps", "Net_Hunter", "Neutral Party", "NeverEnding", "Nick Jensen", "Nick Turner", "Nicky G.", "Night Owl Odysseys", "Nightman Studios", "Nilaum", "Ninetoes82", "Nixalotle", "Nord Games", "Norse Foundry", "Nova Worlds", "NovemberRush", "Nox Arcanum Experiment", "Nutshell's Emporium", "NV Art Assets", "OCCULTLY", "Odd Concoction", "Odinson Games", "Ohmybatman", "Oixxo Art", "Old Mage Games", "Oliver Smith", "On963", "One-Eyed Werebear Gaming Inc.", "OnirArts", "Onyx Path Publishing", "Ori The Cartographer", "Orion D. Black", "Owl Sockets", "Owlbear Emporium", "Owlsthirdeye", "P.Z.", "Painterly Puzzlescapes", "Paizo", "Pale Oracle Atelier", "Pancake Goblin", "PandaAssassin", "Pandamonium Labs", "Paper Forge", "Paper Golems", "Paper Skull", "Paperboy Maps", "PaperDemon", "Paradoxe", "Party of Two", "Pastom", "Patrick (Ruelle) F.", "Patrick Von Raven", "Paul C.", "Paul Camp", "Paul Matijevic", "Paul Ooshun", "Pavle Marinkovic", "PB_Battlemaps", "PeaPu", "Pegasus Spiele", "Pelgrane Press", "Pendelhaven (Fate of the Norns)", "perfectfitz", "Perfectfitz", "Peter Thompson", "Peter's Forge", "Pickpocket Press", "Pierluigi Rimini", "Pineaptor Maps", "Pinnacle Entertainment", "Pinpoint Playground", "pirohmy", "Pixel America", "Pixel Boy Studio", "Pixelart Tokens", "Plague's Pieces", "Plexsoup", "Plum soup", "Pluto City Maps", "PogS Props", "Porcupine Publishing", "Post Scenarium", "Potato's Knights", "Poy", "Practical Games", "Prestige Figures", "Print and Play Productions", "Prosaic Redemption", "Pugsteady", "Quantum Archives", "Queers Play Stuff", "Quests And Chaos", "quietsnooze", "Quill Of Damocles", "Quittance Press", "R. Talsorian Games", "Rachel Jacobson", "Rah's Workshop", "Ramz Art", "Random Alien Games", "Randy Murnighan", "Rantario", "Ravenbohique", "RB Illustration", "Rebekah Sutton", "Red Fisch Games", "Red Lion B&B LLC", "Red Panda Publishing", "Red Pawn Projects", "Red Table Games", "RedCraft", "Reese", "Renegade Game Studios", "Renflowergrapx", "Reno Buchanan", "Retrograde Minis", "Rhapsody Adventures", "Rhasmus", "Rhyannon", "Ri Kreiner", "Richard Bardle", "Richard Tran", "Ridell Apellanes", "Rigel's Roleplaying Realms", "Riley Owens", "Risen Tabletop", "Rite Publishing", "River Octopus Games", "RK Media", "RkdVanguard", "Roaming Gnoll Adventures", "Robert Riter", "Robert Smith", "Robin Fertner", "Robohaven", "RobotAndApril", "Rog Ol", "Roll & Play Press", "Roll For Combat", "Roll20", "Rollacrit", "ROLLINKUNZ!", "Ronald Montoya", "Ronamis", "Roninjutsu", "Rook and Role", "Rookzer0", "Ross Evans", "Roughspun Games", "RPG SmallWorlds", "RPGScenery", "Runebear Cartography", "Runehammer Games", "Runic Tales Inc.", "Runic Wolfe Games", "Russ Hapke", "Rustymaps", "S0LU7I0N", "Safe In Our World", "Sage & Stone Cartography", "Sah", "SailorCat", "Saintash", "Saironwen", "Saivur", "Sal Latora", "Sam Rabbitt", "Samantha Darcy", "Samuel Schultz", "SamuriFerret", "Sanctum of Maps", "Sandstone District", "Sarah Helsley", "Sasha Reneau", "Saul Wynne", "Sauriels_Maps", "Savage Scrolls, by Eddie Porter", "Schwalb Entertainment", "Scribbles in Space", "Sean Archer", "Sean Evans", "Seifer", "Seinstheorie", "Semekleri's Shop", "Sen Cross Art", "Session Zero", "Sewer Brew Games", "Shadowlands Ediciones", "Shambles", "Sharp Mountain Games", "Shaun Ellis", "Shawn Conlin", "Shi-Ying Ong", "Shining", "Shut-in Studios", "Sigil Entertainment Group", "Silky Noire", "Silly Rabbit RPG", "Silver Canon", "Silver Compass Maps", "Silver Spider Art", "Silverwind Workshop", "Simon Powell", "Sir Arthur Whitlock's Emporium of Wondrous Wares", "Sir Kindleknight", "SirInkman", "Skeeterbolt", "Slime Slander", "Sliph Battlemaps", "Slowquest", "SlyFlourish.com", "Small Robert", "sMythic Maps", "Snowy's Maps", "Sokhtar", "Sometimes a Mimic", "Son of Oak Game Studio", "Sophie Campbell", "Sophie Hort", "Sortar's Arcanum", "Souzza", "Space Daddy Games", "Spellarena", "SpicyStarfish", "Spiren", "Splattered Ink Games", "Sponge of Wonder", "Spooky Action Games", "Spotless Dice Games", "Squares & Hexagons", "StainedKarbonMaps", "Stalking Crow", "Stands To Reason Games", "Starsail Games", "Steam & Steel", "Stefan R.", "Stelliadi", "Stephen Shomo", "Steve Prescott", "Steven Colling", "Steven Jelenich", "Stewart Werley", "Stitched Together Maps", "Storm Bunny Studios", "Storm Grave", "Storn Cook", "Storycaster", "Stygian Emperor", "Sun Drake Gaming", "Sun Snake Maps", "Sunset Dragon", "Sunset Industries", "Support Class", "Susanna Snyder", "Sveltheim Chronicler", "Sweet Potato Press", "Swish's Maps", "Swordfish Islands", "Sygdom", "T.A. Gray", "T.M. van Dalen RPG", "Tabletop Goblin", "Tabletop Supplies", "Tactical Master", "Tale-Top Games", "Tan M. Montana", "Tania Gomes Art", "Tannen W.", "TD Maps", "Techlanders", "Tellus", "Tessa Presents Maps", "Thalamus Grondak", "The Amethyst Dragon", "The Arcane Library", "The Awakened Gator", "The Chapel", "The Crafty Dice", "The Cunning Plan ARTFATHER", "The Cyclopean Publishing Company", "The Designated DM", "The DM Lair", "The DM Tool Chest", "The Dungeon Archive", "The Dungeon Warden", "The Dungeoneering Guild", "The Eldritch Press", "The Fluffy Folio", "The Forge Studios", "The Frosty Familiar", "The Goblin Explorer", "The Gremlin Brothers", "The Iso Explorer", "The Knobbywood", "The Lore Observer", "The MAD Cartographer", "The Map Magi", "The Nimble Gnome", "the old \"grunt\" cauldron", "The Oricami Curio", "The Planet Hoppers", "The PMDM", "The Professor", "The Reclusive Cartographer", "The Seraph's Tome", "The Shop on the Hill", "The Sphinx Den", "The Sunlight Covenant", "The Wanderer's Tome", "The Wandering DM", "The Well Dressed Viking", "The Witchborn", "The Wizard Fuu", "The Wolves Den Tavern", "The World of Farland", "The_Gravel_King", "theblakeq", "ThedaCraft", "TheDiceGoddess", "thedungeonskey", "TheLegalLiam's Dragon Imporium", "Theo's Hut", "Theodore Pallas", "Third Act Publishing", "Thomas Smith", "Thomas Synjin's Maps", "Thorny Games", "Tiffany Munro", "Tim Jenkins", "Tim P. GMing", "Tin Star Games", "Tiny Den", "Tiny Den ", "Titan's Dawn", "Toby Lancaster at Dark Realm Maps", "Todd Gamble", "Tokenetics", "Tolgrins Forge", "Tom Cartos", "ToMa", "Tome of Maps", "Tome of Summoning", "Tomesmith Press", "Tony Dowler", "Tonz0Maps", "Torchlit Maps", "Torekdva", "Travis Kelly", "treblejeff", "Trevor Wolthuis", "Tribality Publishing", "Troll Lord Games", "TruRPG Adventures", "Tspuun", "TTRPGHQ", "Tulsevran's Menagerie", "turgon", "Turnbury Press", "Tuslevran's Menagerie", "Tvrtko Validžić", "Twin Fangs Art Studio", "Twisted Rainy", "Twitch the Fiend", "Two Brave Puffins", "Two Cat Creations", "Tyler Geovex", "TYPE40", "Uhrwerk Verlag", "Ulisses Medien & Spiel Distribution", "Ulisses Medien & Spiel Distribution", "Underground Oracle Publishing", "Unhelpful Creations", "Unicorn Motorcycle Games", "Unlimited Realms Ltd", "Unseendominions", "UrbanSunrises", "Valentine's Exotics", "ValetheDM", "Valiant Fox Gaming", "Valor Maps", "Vanderforge", "VarietyPax", "Vektor", "Velhior", "Velhior_H", "Venatus Maps", "Venger's Decks", "VerdeSquid", "Veris Design", "Vertighost", "vge", "Vhey Preexa", "Vicnedel", "Vigilem, LLC", "Villagelder", "Vincent de Vries", "Vincent Marocco", "ViSoMaps", "Vitaliya Mudraya", "Vivid Chaos", "Voisin4", "Vortex Verlag", "Voxii", "VTT Sketch", "wackyusername", "Wakô", "Wandering Alchemist Games", "WarDrumRPG", "WarSpeakerGames", "WatcherDM", "Waysider Press", "waza", "Weird Works LLC", "WendiGh0st", "Wham's Maps", "Which Game First", "WhimsiKarren's Warehouse", "White Fox Works", "White Wind Studio", "Wicked Willow Art", "Wider Path Games", "Wild Boar Maps", "Wild Magic Surge", "Wild Shape Society", "Wildjourney's Eclectic Collections", "William Lyday", "William McAvoy", "Willow", "Windspire Adventures", "Wizards of the Coast", "Wolf & Raven Games", "Wolf's Forge", "Wolfman and Donna", "Wolfwood", "Wooden Leg Named Smith Productions", "Woodenswordink", "Woods Gaming", "Wordforger", "WrightOn", "WychorianDreams", "WyldBore Productions", "X10 Game Studios", "Xeylisia", "XIG Games", "Xiurhn-Art", "Xploringmap", "Yasashii Kyojin Studio", "Yellowbyte Studios", "YH-Arts", "Yuikami", "Zac Goins", "Zach Moeller", "Zantonny Maps", "Zee Bashew", "Zen Pen Games", "Zero_", "Zeshio"]; var $cat = {"Art":{"Tokens":{"Figures":{},"Bordered Tokens":{},"Portraits":{},"Token Elements":{},"Status Icons":{}},"Maps":{"Tile Sets":{},"Map Packs":{},"World Maps":{},"Dynamically Lit Maps":{},"Dashboards":{}},"Token Markers":{},"Objects":{"Structures":{},"Nature":{},"Inventory":{},"Decor":{},"Map Markers":{},"Magic & Effects":{},"Vehicles":{}},"Weather":{},"Music":{}},"Games":{"RPG Rulebooks":{"Core Games":{},"Bestiaries":{},"Rules Expansions":{},"Addons":{"Characters":{},"Monsters":{},"Items":{},"Locations":{},"Effects":{},"Idea Prompts":{},"Puzzles":{},"Play Aids":{}}},"Adventures":{"One Shots":{},"Short Campaigns":{},"Long Campaigns":{},"Quickstart":{}},"Board & Card Games":{"Classic":{},"Strategy":{},"Party":{},"Family":{},"Card Decks":{}}}}; var $tags = {"Game System":{"Any":{},"13th Age":{},"2d20":{"Dune: Adventures in the Imperium":{},"Fallout":{}},"Adventure Game Engine (AGE)":{},"Alien RPG":{},"Apocalypse World":{},"Blade Runner RPG":{},"bunker 2056":{},"Burning Wheel":{},"Burn Bryte":{},"Call of Cthulhu":{"7th Edition":{},"Other Editions":{}},"Candela Obscura":{},"Castles & Crusades":{},"Conan":{},"Coyote & Crow":{},"Cyberpunk RED":{},"Cypher System":{"Numenera":{},"The Strange":{},"Cypher System":{}},"d20 Modern":{},"D616":{"Marvel Multiverse":{}},"DarkEnergy":{"1.5 Edition":{}},"Das Schwarze Auge/The Dark Eye":{},"Delta Green":{},"Desperation":{},"Dragonbane":{},"Dungeon Crawl Classics":{},"Dungeons & Dragons":{"5E":{},"4E":{},"3.5":{},"2E":{},"1E":{}},"Earthdawn":{},"Essence20 Roleplaying System":{"Power Rangers":{},"GI Joe":{},"Transformers":{},"My Little Pony":{}},"Forged in the Dark":{"Blades in the Dark":{},"Band of Blades":{},"Scum and Villainy":{}},"Fate":{"Core":{},"Accelerated":{},"Condensed":{},"Fate of Cthulhu":{}},"GeneFunk 2090":{},"Gumshoe":{},"HERO System":{"Champions Complete 6th Edition":{}},"Kids on Bikes":{},"Monster of the Week":{},"Mutants & Masterminds":{"2e":{},"3e":{}},"Savage Worlds Adventure Edition":{},"Shadowrun":{},"Star Trek":{},"Starfinder":{},"Pathfinder":{"2nd Edition":{},"1st Edition":{}},"Paranoia":{},"Pendragon":{},"Pirate Borg":{},"Powered by the Apocalypse":{"Monster of the Week":{},"Thirsty Sword Lesbians":{},"Apocalypse Keys":{}},"Rolemaster":{"Unified":{}},"Storypath":{"Scion 2E":{},"They Came From Beneath the Sea!":{}},"Tales of the Valiant":{},"Torg Eternity":{},"Tormenta":{},"Vampire: The Masquerade":{"5th Edition":{}},"Velvet Generation":{},"Warhammer Fantasy Roleplay":{"4th Edition":{},"3rd Edition":{},"2nd Edition":{},"1st Edition":{}},"Year Zero Engine":{},"Zweihander":{},"Other":{},"Required":{}},"Installation":{"Art Pack":{},"Addon":{},"Module":{},"Compendium":{},"Token Marker Set":{},"Required":{}},"Downloadable":{"Yes":{},"No":{}},"Genre":{"Agnostic":{},"Fantasy":{},"Scifi":{},"Modern":{},"Historical":{},"Horror":{},"Steampunk":{},"Superhero":{},"Apocalypse":{},"Sports":{}},"Age Recommendation":{"Child Friendly":{},"Teens and Up":{},"Mature":{},"Required":{}},"Features":{"Animated":{},"Card Decks":{},"Charactermancer Support":{},"Doors & Windows":{},"Dynamic Lighting":{},"Macros":{},"Rollable Tables":{},"Token Markers":{},"Audio/Music":{}},"Art Style":{"None":{},"Traditional":{},"Cartoon":{},"Anime":{},"PhotoRealistic":{},"3D Model":{},"Pixel":{},"Black & White":{},"Required":{}},"Perspective":{"Top Down":{},"Isometric":{},"Front Facing":{},"Required":{}},"Grid":{"None":{},"Square":{},"Hex":{},"Required":{}},"Starting Level":{"Low":{},"Medium":{},"High":{},"Epic":{}},"Players Min":{"1":{},"2":{},"3":{},"4":{},"5":{},"6+":{},"Required":{}},"Players Max":{"1":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8+":{},"Required":{}},"Language":{"Required":{},"English":{},"Deutsch":{},"Español":{},"Français":{},"Italiano":{},"Português":{},"Russian / Русский":{},"Svenska":{}},"License":{"None":{},"Commercial License Available":{}},"Unique Status":{"Bundle":{},"Generated Images":{},"Indie":{},"Official Content":{},"Roll20 Produced":{},"D&D Best Seller":{},"Free Starter":{},"Free Art":{},"Free Legacy":{},"Paizo Core":{},"Paizo Best Seller":{},"DnD2024":{},"Playset":{},"SPRINGDND25":{}}}; const translations = { wishlist_alert_add_item: `Item added to wishlist.`, wishlist_items: `{{0}} items`, wishlist_public: `Public`, wishlist_private: `Private`, wishlist_in_list: `Item already in wishlist`, add_to_wishlist: `Add to Wishlist`, wishlist_none: `You currently have no wishlists.`, wishlists_create: `Create New Wishlist` }; </script> <!-- this is specific to the marketplace footer, for now --> <div class="row marketplace-footer-add"> <div class="col-md-4"> <h4>About Roll20 Marketplace</h4> <p>The Roll20 Marketplace is the premiere online store for digital maps, tiles, tokens, and modules used in online tabletop gaming. Our assets are produced by independent artists and made available for the enjoyment of tabletop gamers worldwide.</p> </div> <div class="col-md-4 social-links"> <h4>Stay Connected</h4> <p>Stay connected with us via Facebook, Twitter, YouTube, Twitch, and Instagram to hear the latest news.</p> <p class="social-link-icons"><a href="https://www.tiktok.com/@roll20app" target="_blank"><img src="/v2/images/social-tiktok.png" alt="Roll20 on TikTok" style="max-height: 41px;"/></a><a href="https://www.facebook.com/pages/Roll20/439774126041559"><img src="/v2/images/social-fb.png" alt="Roll20 on Facebook" /></a><a href="https://twitter.com/roll20app"><img src="/v2/images/social-twitter.png" alt="Roll20 on Twitter" /></a><a href="https://www.youtube.com/channel/UCHC1kWACzA7G6D2fqkqsRDg" target="_blank"><img src="/v2/images/social-youtube.png?v=2" alt="Roll20 on YouTube" /></a><a href="http://twitch.tv/roll20app"><img src="/v2/images/social-twitch.png" alt="Roll20 on Twitch" /></a><a href="https://www.instagram.com/roll20app/"><img style="margin-right: 10px;" src="/v2/images/social-instagram.png" alt="Roll20 on Instagram" /></a></p> </div> <div class="col-md-4 join-newsletter"> <h4>Become a Creator</h4> <p>If you're interested in creating new assets (tokens, maps, or modules) for sale through the Marketplace, we have all the info you need on our <a href="https://pages.roll20.net/marketplace-creators" target='_blank'>Become a Creator page</a>.</p> </div> </div> <style> .marketplace-footer-add{ padding: 15px 10rem 0 10rem; } @media (max-width: 1024px) { .marketplace-footer-add{ padding: 15px 7rem 0 7rem; } } </style> <footer id="footer" class="container globalfooter"> <div class="footer-terms"> <a href="https://roll20.net/" target="_blank"><img src="/v3/assets/img/logos/roll20-logo-new-light.svg" alt="Go to Roll20 Homepage"/></a> <span>© Roll20, LLC | <a href="https://help.roll20.net/hc/articles/360037770793-Terms-of-Service-and-Privacy-Policy#Notification_of_Copyright_Infringement_.28DMCA_Policy.29" target="_blank">Terms of Service & Privacy Policy</a> | <a href="https://help.roll20.net/hc/articles/360037770833-DMCA" target="_blank">DMCA</a> | <a href="https://roll20.zendesk.com/hc/requests/new " target="_blank">Contact Us</a> | <a href="https://roll20.net/help" target="_blank">Help Center</a> | All rights reserved. All product and company names are trademarks<sup>™</sup> or registered<sup>®</sup> trademarks of their respective holders.</span> <div class="socials"> <a href="http://discord.gg/roll20" target="_blank"><img src="/v2/images/Discord-LightMode.png" alt="Join the Roll20 Discord Server" /></a> <a href="https://www.facebook.com/roll20app/" target="_blank"><img src="/v2/images/Icon-Facebook.png" alt="Go to Roll20 on Facebook" /></a> <a href="https://x.com/roll20app" target="_blank"><img src="/v2/images/Icon-X.png" alt="Go to Roll20 on Twitter" /></a> <a href="https://bsky.app/profile/roll20.net" target="_blank"><img src="/v2/images/Icon-Bluesky.png" alt="Go to Roll20 on Bluesky" /></a> <a href="https://www.instagram.com/roll20app/" target="_blank"><img src="/v2/images/Icon-Instagram.png" alt="Go to Roll20 on Instagram" /></a> <a href=" https://www.tiktok.com/@roll20app?lang=en" target="_blank"><img src="/v2/images/Icon-TikTok.png" alt="Go to Roll20 on TikTok" style="max-height: 41px;"/></a> <a href="https://www.youtube.com/roll20app" target="_blank"><img src="/v2/images/Icon-YouTube.png" alt="Go to Roll20 on YouTube" /></a> <a href="https://www.twitch.tv/roll20app " target="_blank"><img src="/v2/images/Icon-Twitch.png" alt="Go to Roll20 on Twitch" /></a> <a href="https://www.linkedin.com/company/roll20/" target="_blank"><img src="/v2/images/Icon-LinkedIn.png" alt="Go to Roll20 on LinkedIn" /></a> </div> </div> <div class="footer-content"> <span class="powered-by">Powered by Roll20</span> <div class="grid-container"> <div class="section"> <a class="section-title" href="https://roll20.net" target="_blank">Roll20 <br> The #1 Tabletop for Playing RPGs Online</a> <p class="collapsed-section-title">Roll20 <br> <i>The #1 Tabletop for Playing RPGs Online</i></p> <div class="section-content"> <a href="https://roll20.net" target="_blank">Roll20 Tabletop</a> <a href="https://app.roll20.net/characters" target="_blank">Roll20 Characters</a> <a href="https://marketplace.roll20.net" target="_blank">Roll20 Marketplace</a> <a href="https://roll20.net/compendium" target="_blank">Roll20 Compendium</a> </div> </div> <div class="section"> <a class="section-title" href="https://drivethrurpg.com/" target="_blank" aria-label="Go to DriveThru Homepage">DriveThru <br> The Largest RPG Marketplace</a> <p class="collapsed-section-title">DriveThru <br> <i>The Largest RPG Marketplace</i></p> <div class="section-content"> <a class="homepage-link" href="https://drivethrurpg.com/" target="_blank">DriveThru</a> <a href="https://www.drivethrucomics.com/" target="_blank">DriveThruComics</a> <a href="https://www.drivethrufiction.com/index.php" target="_blank">DriveThruFiction</a> <a href="https://www.drivethrucards.com/" target="_blank">DriveThruCards</a> <a href="https://www.wargamevault.com/" target="_blank">Wargame Vault</a> </div> </div> <div class="section"> <a class="section-title" href="https://app.demiplane.com/home" target="_blank" aria-label="Go to Demiplane Homepage">Demiplane <br> Official Character Creation and Game Companion</a> <p class="collapsed-section-title">Demiplane <br> <i>Official Character Creation and Game Companion</i></p> <div class="section-content"> <a class="homepage-link" href="https://app.demiplane.com/home" target="_blank">Demiplane</a> <a href="https://app.demiplane.com/nexus/pathfinder2e" target="_blank">Pathfinder Nexus</a> <a href="https://app.demiplane.com/nexus/daggerheart" target="_blank">Daggerheart Nexus</a> <a href="https://app.demiplane.com/nexus/vampire" target="_blank">Vampire: The Masquerade Nexus</a> <a href="https://app.demiplane.com/nexus/marvelrpg" target="_blank">Marvel Multiverse RPG Nexus</a> <a href="https://app.demiplane.com/nexus/cosmererpg" target="_blank">Cosmere RPG Nexus</a> <a href="https://cyberpunkrednexus.com" target="_blank">Cyberpunk RED Nexus</a> </div> </div> <div class="section"> <a class="section-title" href="https://www.dungeonscrawl.com/" target="_blank" aria-label="Go to Dungeon Scrawl Homepage">Dungeon Scrawl <br> Create RPG Maps in Minutes</a> <p class="collapsed-section-title">Dungeon Scrawl <br> <i>Create RPG Maps in Minutes</i></p> <div class="section-content"> <a class="homepage-link" href="https://www.dungeonscrawl.com/" target="_blank">Dungeon Scrawl</a> <a href="https://www.dungeonscrawl.com/" target="_blank">Create a Map</a> </div> </div> <div class="section"> <span class="section-title community-content">Community Content</span> <p class="collapsed-section-title">Community Content <br> <i>Adventure by Fans Everywhere</i></p> <div class="section-content"> <a href="https://www.dmsguild.com/" target="_blank">Dungeon Masters Guild (D&D)</a> <a href="https://www.pathfinderinfinite.com/" target="_blank">Pathfinder Infinite</a> <a href="https://www.starfinderinfinite.com/" target="_blank">Starfinder Infinite</a> <a href="https://www.drivethrurpg.com/cc/16/Miskatonic " target="_blank">Miskatonic Repository</a> <a href="https://www.storytellersvault.com/" target="_blank">Storytellers Vault</a> </div> </div> </div> </div> <div class="footer-bottom"> <div class="dice"> <img src="/v2/images/Icon-Dice.svg" alt="Dice Icon"/> </div> <div class="roll20-logos"> <div class="roll20-logo-text"> <img src="/v2/images/roll20-logo.png" alt="Pink Roll20 Logo"/> <p class="bottom-text">Everything for <br> your adventures</p> </div> <div class="all-logos"> <img src="/v3/assets/img/logos/roll20-logo-new-light.svg" alt="Pink Roll20 Logo"/> <img src="/v2/images/DriveThruRPG-LG.png" alt="DriveThru RPG Logo"/> <img src="/v2/images/Demiplane-LG.png" alt="Demiplane Logo"/> <img src="/v2/images/DMG-LG.png" alt="Dungeon Masters Guild Logo"/> <img src="/v2/images/DungeonScrawl-LG.png" alt="Dungeown Scrawl"/> </div> </div> </div> </footer> <style> #footer { padding-top: 3rem; } .footer-terms{ display: flex; justify-content: space-around; align-items: center; font-weight: 300; font-size: 1.3rem; line-height: 1.5rem; } .footer-terms span{ width: 60%; padding-left: 1rem; font-size: 1rem; } sup { /* necessary to override stylings */ top: 0; font-size: 100%; } .powered-by { display: flex; align-items: center; text-align: center; padding: 2rem 3.5rem; } .powered-by::before, .powered-by::after { content: ""; flex: 1; border-bottom: 1px solid rgba(98, 91, 101, 1); margin: 0 10px; } .section-content{ display: flex; flex-direction: column; } .section-content a{ color: var(--color-grayscale1); } .homepage-link{ display: none; } .community-content{ color: var(--color-primary-text) !important; } /* Large screens - 3 columns layout (2, 1, 2) */ .grid-container { display: grid; grid-template-columns: 1fr 1fr 1fr; /* Three columns */ gap: 10px; align-items: start; /* Ensures items align to the top of the grid */ grid-auto-flow: dense; padding-left: 3.5rem; } /* Define where each section goes in the grid */ .section:nth-child(1), .section:nth-child(2) { grid-column: 1; } .section:nth-child(3) { grid-column: 2; grid-row: span 2; } .section:nth-child(4){ grid-column: 3; grid-row: 1; } .section:nth-child(5) { grid-column: 3; grid-row: 2; /* below two lines are to move the final section up out of the set grid to match design */ position: relative; top: -60px; } .collapsed-section-title{ display: none; } .dice{ display: flex; align-items: center; text-align: center; justify-content: center; padding: 0 7.5rem; } .dice::before, .dice::after { content: ""; flex: 1; border-bottom: 1px solid rgba(98, 91, 101, 1); margin: 0 10px; } .roll20-logo-text{ display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; } .roll20-logo-text img{ height: 5rem; } .bottom-text{ color: var(--color-grayscale1); text-transform: uppercase; font-weight: 600; } .footer-bottom{ padding-bottom: 30px; } .roll20-logos{ padding: 2rem 0 2rem 3rem; display: flex; justify-content: space-between; } .all-logos{ text-align: center; width: 73%; max-width: 50rem; } .all-logos img{ padding-right: 1rem; } /* There is a higher-level page break in a different CSS file, so I need to handle a specific width here when that happens */ @media (max-width: 1200px) { .all-logos { width: 70%; } .all-logos img{ padding-right: 1rem; } } /* There is a higher-level page break in a different CSS file, so I need to handle a specific width here when that happens */ @media (max-width: 991px) { .footer-terms span { width: 48%; padding-left: 10px; } } /* Medium screens - 2 columns layout (2, 3) */ @media (max-width: 1024px) { .grid-container { grid-template-columns: 1fr 1fr; /* Two equal columns */ } .section:nth-child(1), .section:nth-child(2) { grid-column: 1; } .section:nth-child(2){ position: relative; top: -30px; } .section:nth-child(3){ grid-column: 2; grid-row: 1 } .section:nth-child(4){ grid-column: 2; grid-row: 2 } .section:nth-child(5) { grid-column: 2; grid-row: 3; } .footer-bottom{ position: relative; top: -30px; } .all-logos{ display: none; } .roll20-logos{ justify-content: center; } .dice { padding: 0; } } /* Small screens - 1 column, collapsible sections */ @media (max-width: 768px) { .section-title { display: none; } .socials{ display: flex; gap: 1rem; padding-top: 1rem; } .collapsed-section-title{ display: unset; width: 100%; font-weight: 600; } .footer-terms{ flex-direction: column; } .footer-terms span{ display: none; } .footer-content{ display: flex; flex-direction: column; } .grid-container { display: flex; flex-direction: column; align-self: center; width: 85%; padding-left: 0; position: relative; left: -16px; } .homepage-link{ display: unset; } .globalfooter p{ color: var(--color-grayscale1); } .section{ display: flex; align-items: center; justify-content: space-between; width: 100%; flex-direction: column; border-bottom: 1px solid rgba(98, 91, 101, 1); width: 110%; } .section-content a{ color: var(--color-primary-text); font-size: 1rem; } .section:nth-child(2){ top: 0; } .section:nth-child(5) { top: 0; } i { font-weight: 400; } .section-content { display: none; /* Hidden by default */ } .section.active .section-content { display: flex; /* Show content when active */ flex-direction: column; align-items: flex-start; width: 98%; font-size: 1.5rem; padding: 0 0 10px 5px; } .collapsed-section-title::after { content: '+'; float: right; } .collapsed-section-title.active::after { content: '-'; transform: scaleX(1.8); } .footer-bottom{ position: relative; top: 20px; } .powered-by { display: flex; align-items: center; text-align: center; padding: 2rem 0; } .roll20-logos{ padding: 2rem 0; } } </style> <script> // Toggle collapsible sections on small screens document.querySelectorAll('.collapsed-section-title').forEach(section => { section.addEventListener('click', function() { this.classList.toggle('active'); this.parentElement.classList.toggle('active'); }); }); </script> <!-- This is the footer that is shared across all pages --> <script type="text/javascript"> $(function() { var cookieName = 'roll20tempauth'; var cookieValue = Math.floor(Math.random()*100); var myDate = new Date(); myDate.setMonth(myDate.getMonth() + 1); var cookieinfo = cookieName +"=" + cookieValue + ";expires=" + myDate + ";domain=.roll20.net;path=/"; document.cookie = cookieinfo; // var s = document.createElement('script'); // s.type = 'text/javascript'; // s.src = 'https://app.roll20.net/sessions/topbar/'+cookieValue; // var x = document.getElementsByTagName('script')[0]; // x.parentNode.insertBefore(s, x); }); </script> <script id="tmpl_campaigntag" type="text/html"> <div class="tag"><$=this.model.get("tag")$></div> </script> <script id="tmpl_campaigntags" type="text/html"> <div class="tags tagset"> <div class="tagslabel"> <span class="pictos">z</span> Tags: </div> <input> <$ if(this.editable == "true") { $> <div class="add"> <em> <span class="pictos">p</span> Edit Tags </em> </div> <$ } $> </div> <div class="clear"></div> </script> <script id="tmpl_tokentag" type="text/html"> <div class="tag"> <$=this.model.get("tag")$> </div> </script> <script id="tmpl_tokentags" type="text/html"> <div class="tags tagset"> <div class="label"> <span class="pictos">z</span> Global Tags: </div> <input /> <$ if(this.editable == "true") { $> <div class="add"> <em> <span class="pictos">p</span> Edit Tags </em> </div> <$ } $> </div> <div class="clear"></div> </script> <script id="tmpl_yourtag" type="text/html"> <div class="tag"> <$=this.model.get("tag")$> </div> </script> <script id="tmpl_yourtags" type="text/html"> <div class="tags tagset"> <div class="label"> <span class="pictos">z</span> Global Tags: </div> <input /> <$ if(this.editable == "true") { $> <div class="add"> <em> <span class="pictos">p</span> Edit Tags </em> </div> <$ } $> </div> <div class="clear"></div> </script> <script id="tmpl_uploadslot" type="text/html"> <div class="avatar dropbox <$! (this != "" ? "filled" : "empty") $>"> <div class="status"></div> <div class="inner"> <$ if(this == "") { $> <h4 style="padding-bottom: 0px; marigin-bottom: 0px; color: #777;">Drop a File<small>(JPG, PNG, GIF)</small></h4> <div style="margin-top: -5px; margin-bottom: 5px;">or</div> <a href="javascript:void(0);" class="btn btn-info" style="margin-bottom: 10px;">Choose a File...</a> <input class="manual" type="file" /> <$ } else { $> <img src="<$!this$>" /> <div class='remove'><a href='javascript:void(0);'>Change Image</a></div> <$ } $> </div> </div> </script> <script type="text/javascript"> $(function() { setTimeout(function(){ if($(".obs_container").length > 0) { // GA Event Tracking ga('send', { 'hitType': 'event', 'eventCategory': 'obsAdvert', 'eventAction': 'topbar', 'eventLabel': '' }); } }, 0); $(".localtimeme-short").each(function() { let time = parseInt($.trim($(this).text()), 10); let d = new Date(time*1000); $(this).attr("data-timestamp", d.getTime()); let mytimezone = ""; if(d.toLocaleString) { mytimezone = d.toLocaleString('en', {timeZoneName: 'short'}).split(' ').pop(); } const options = { month: 'long', hour:'numeric', minute:'numeric', day: 'numeric', timeZoneName: 'short' }; $(this).text(d.toLocaleDateString('en-EN', options)); }); }); $("#roll20-top .loginform button").on("click", function() { console.log("click"); var $form = $(this).parents("form"); $form.attr("action", $form.attr("action") + "?backto=" + escape(window.location)); $form.submit(); return false; }); $(".topbarnotifications .notification button").on("click", function() { var notid = $(this).attr("data-notification-id"); var othis = this; $.getJSON("https://app.roll20.net/notifications/dismiss/" + notid + "/?callback=?", function(data) { if(notid == "all") { $(othis).parents(".notifications").fadeOut(); $(".alertcount").html(""); $(".topbarnotifications .dropdown-menu").remove(); $(".topbarnotifications.nav-item-messages").html("<a href='https://app.roll20.net/private_message/inbox/' class='nav-link'><i class='fas fa-envelope'></i></a>"); return; } if($(othis).attr("href")) { window.location = "https://app.roll20.net" + $(othis).attr("href"); } else { $(othis).parents(".notification").fadeOut(); var $count = $(othis).parents(".notifications").find("a .count"); var current = parseInt($.trim($count.text()), 10); current = current - 1; if(current < 0) current = 0; $count.text(current); countdown = parseInt($(".alertcount").html(), 10) $(".alertcount").html(countdown - 1); if(countdown < 2) { $(othis).parents(".notifications").fadeOut(); $(".alertcount").html(""); $(".topbarnotifications .dropdown-menu").remove(); $(".topbarnotifications.nav-item-messages").html("<a href='https://app.roll20.net/private_message/inbox/' class='nav-link'><i class='fas fa-envelope'></i></a>"); return; } } }); return false; }); $(".topbarsitenotifications .newalerts").on("click", function() { }); $("#navbar-notifications__see-more-btn").on("click", function() { window.location = "https://app.roll20.net/sitenotifications"; }); $("#menu-mobile-site-alerts").on("click", function(e) { e.preventDefault(); window.location = "https://app.roll20.net/sitenotifications"; }); $("#remove-admin-menu").on("click", function() { $("#menu-adminhalla").remove(); $("ul.dropdown-menu[aria-labelledby='menu-adminhalla']").remove(); $(".logo img").prop("style", ""); }); if(window.dataLayer) { dataLayer.push({ 'event': 'start_pw'}); } </script> <style> .bottom-banner { background-color: #fff; position: fixed; bottom: 40px; z-index: 9999; width: calc(100% - 30px); margin-left: 15px; box-shadow: 0px 0px 16px #888888; display: flex; align-items:center; justify-content: space-around; } .bottom-banner-css-version-v2{ border-left: 15px solid #ec008c; } .bottom-banner-css-version-v3{ border-left: 15px solid #35c8f5; } .bottom-banner-css-version-v2 .bottom-banner__button{ background-color: #35c8f5; } .bottom-banner-css-version-v3 .bottom-banner__button{ background-color: #ec008c; } .bottom-banner--hidden { display:none; } .bottom-banner__message { padding: 1em; float: left; font-size: 12px; line-height: 1.4; } .bottom-banner__dismiss-icon { float: right; padding:10px; color: #d1d1d1; cursor: pointer; align-self: flex-start; } .bottom-banner__dismiss-icon:hover { color: #333333; } .bottom-banner__button, .bottom-banner__button:hover, .bottom-banner__button:visited, .bottom-banner__button:active { float:right; font-size: 16px; line-height: 1.6; border-radius: 4px; padding: 7px 15px 7px 15px; color: #fff !important; transition: all .25s linear; text-decoration: none; } .bottom-banner__button:hover { color: #fff; } .cookie-modal--hidden { display: none; position: fixed; z-index: 10001; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; } .cookie-modal-content { background-color: var(--color-surface1); margin: 20% auto; padding: 20px; width: 40%; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.6), 0 6px 20px 0 rgba(0, 0, 0, 0.19); } .cookie-modal-content h3 { display: inline-block; } .cookie-modal-css-version-v3 { padding-top: 16px; } .cookie-modal_switch .switch{ display: inline-block; float: right; margin-top: 30px; width: 60px; } .switch { position: relative; display: inline-block; width: 60px; height: 26px; } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #8492A6; -webkit-transition: .3s; transition: .3s; } .slider:after { content: "Off"; position: absolute; top: 50%; right: 11px; transform: translateY(-50%); color: #fff; font-family: helvetica; font-weight: bold; font-size: 13px; } .slider:before { position: absolute; content: ""; height: 20px; width: 20px; left: 3px; bottom: 3px; background-color: white; -webkit-transition: .3s; transition: .3s; } input:checked + .slider { background-color: #00853C; } input:disabled + .slider { cursor: no-drop; background-color: #C2C7D1; } input:disabled + .slider:before { background-color: #DFE2E7; } input:focus + .slider { box-shadow: 0 0 5px #2196F3; } input:checked + .slider:before { -webkit-transform: translateX(33px); -ms-transform: translateX(33px); transform: translateX(33px); } input:checked + .slider:after { content: "On"; right: auto; left: 11px; } /* Rounded sliders */ .slider.round { border-radius: 26px; width: 60px; } .slider.round:before { border-radius: 50%; } .close { float: right; font-size: 20px; font-weight: bold; line-height: 18px; color: var(--color-grayscale1); text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover { color: var(--color-grayscale1); text-decoration: none; opacity: 0.4; filter: alpha(opacity=40); cursor: pointer; } </style> <!--googleoff: all--> <div id="gdpr-notification" class="bottom-banner bottom-banner--hidden bottom-banner-css-version-v3"> <div class="bottom-banner__message"> Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences <a href='#' id='banner-link-preferences'>here</a>. </div> <span class="bottom-banner__dismiss-icon" id="gdpr-notification-dismiss-button" aria-label="Close Cookie Toast" role="button" tabindex="0">×</span> </div> <div id="cookie-modal" class="cookie-modal--hidden"> <!-- Modal content --> <div class="cookie-modal-content cookie-modal-css-version-v3"> <span class="close" id="cookie-modal-dismiss">×</span> <h3>Cookie Preferences</h3> <span class="cookie-modal_switch"> <label class="switch"> <span class="sr-only">Accept cookies</span> <input class="feature_toggle" id="cookie-modal-input" type="checkbox"> <span class="slider round"></span> </span> <hr> We use Cookies to help personalize and improve Roll20. For more information on our use of non-essential Cookies, visit our Privacy Policy <a href=https://roll20.zendesk.com/hc/articles/360037770793-Terms-of-Service-and-Privacy-Policy target='_blank'>here.</a> </div> </div> <!--googleon: all--> <script src="https://www.datadoghq-browser-agent.com/datadog-rum.js" type="text/javascript"> </script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-31040388-1"></script> <script type="text/javascript" nonce=""> // Google analytics function to send events via analytics.js // Remove after everything has been switched to gtag (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); // Google analytics function to send events via gtag.js function gtag(){dataLayer.push(arguments);} initializeOldGoogleAnalytics(); initializeNewGoogleAnalytics(); window['ga-disable-UA-31040388-1'] = true; var gdprCookie = getCookie("gdpr_accepts_cookies"); if (gdprCookie != undefined) { gdprCookie == "true" ? gdprCookie = true : gdprCookie = false; }; var gdprBanner = document.getElementById("gdpr-notification"); var gdprBannerDissmissButton = document.getElementById("gdpr-notification-dismiss-button"); var gdprLoggedIn = false; var gdprAccountAcceptsCookies = null; var cookieModal = document.getElementById("cookie-modal"); var cookieModalClose = document.getElementById("cookie-modal-dismiss"); var cookieModalSwitch = document.getElementById("cookie-modal-input"); var bannerLinkPreferences = document.getElementById("banner-link-preferences"); bannerLinkPreferences.onclick = function () { cookieModal.style.display = 'block'; hideGDPRBanner(); } function setGDPRCookie(value, expirationInDays) { var date = new Date(); date.setTime(date.getTime() + expirationInDays * 24 * 60 * 60 * 1000); //convert to milleseconds var expires = "expires="+ date.toUTCString(); document.cookie = "gdpr_accepts_cookies=" + value + ";" + expires + ";path=/"+ ";domain=.roll20.net"; } function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return undefined; } function checkGdprStatus() { if (gdprLoggedIn == true) { checkAccountGdprCookieSettings(); } else { checkPublicGdprCookieSettings(); } } function checkAccountGdprCookieSettings() { var cookieExists = getCookie("gdpr_accepts_cookies"); switch(cookieExists){ case "true": acceptCookies(); break case "false": denyCookies(); break case undefined: showGDPRBanner(); acceptCookies(); break } } function checkPublicGdprCookieSettings() { console.log('Not logged in - checking cookie GDPR status'); const in_discord = false; if (gdprCookie == undefined) { console.log("No GPDR Cookie Detected"); // If a user is logging in from the discord activity, we want to deny our cookies by default so we don't show the cookie banner. Later, we can figure out a better way to handle instead of denying out of the gate (so we have analytics, for example), but for MVP, this works if(in_discord){ denyCookies(); }else{ showGDPRBanner(); acceptCookies(); } } else if (gdprCookie == true){ console.log("GDPR Cookie Detected"); acceptCookies(); } } // Options object for google analytics based on the current account function getAnalyticsConfigOptions() { return {'cookieDomain': 'auto'} } // Not impacted by GDPR - just connects our account // Remove after everything has been switched to gtag function initializeOldGoogleAnalytics() { ga('create', 'UA-31040388-1', getAnalyticsConfigOptions()); } // Not impacted by GDPR - just connects our account function initializeNewGoogleAnalytics() { window.dataLayer = window.dataLayer || []; gtag('js', new Date()); // Universal analytics gtag('config', 'UA-31040388-1', { ...getAnalyticsConfigOptions(), send_page_view: false }); // Google Analytics 4 gtag('config', 'G-SZLSVQPSWG', { ...getAnalyticsConfigOptions(), send_page_view: false }); } function turnOnGoogleAnalytics() { window['ga-disable-UA-31040388-1'] = false; ga('send', 'pageview'); if(window.dataLayer) { dataLayer.push({'event': 'optedIn'}); } } var showGDPRBanner = function () { gdprBanner.classList.remove("bottom-banner--hidden"); } var hideGDPRBanner = function () { gdprBanner.classList.add("bottom-banner--hidden"); } var updateUserAccount = function(account_id, value) { var xhr = new XMLHttpRequest(); // need to get the below working for marketplace, compendium, landing (only works for app) xhr.open("PATCH", '/accounts/'+account_id, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); var cookieValue = "account[gdpr_accepts_cookies]=" + value; xhr.send(cookieValue); } var acceptCookies = function () { setGDPRCookie(true, 365); turnOnGoogleAnalytics(); turnOnDataDogRUM(); // hideGDPRBanner(); document.getElementById("cookie-modal-input").checked = true; } var denyCookies = function () { setGDPRCookie(false, 365); } var toggleCookie = function () { var switchChecked = document.getElementById("cookie-modal-input").checked; setGDPRCookie(switchChecked, 365); } var showCookieModal = function (){ cookieModal.style.display = "block"; } var closeCookieModal = function (){ cookieModal.style.display = "none"; } if (gdprCookie == true || gdprAccountAcceptsCookies == true){ document.getElementById("cookie-modal-input").checked = true; } gdprBannerDissmissButton.addEventListener("click", hideGDPRBanner); cookieModalClose.addEventListener("click", closeCookieModal); cookieModalSwitch.addEventListener("click", toggleCookie); checkGdprStatus(); function vttSampleRate() { const sampleRate = 0; if (sampleRate > 5) return sampleRate; return 5; } function experiment({ chatTech }) { const experimentsEnabled =false; return experimentsEnabled && chatTech === 'simple-peer'; } function staging({ hostName }) { return hostName === 'roll20staging.net'; } function ddSampleRate(opts) { if (experiment(opts)) return 100; return staging(opts) ? 100 : vttSampleRate(); } function turnOnDataDogRUM () { var tmplMeta = { chatTech: '', hostName: 'roll20.net', version: '25.3.20.3', }; var sampleRate = ddSampleRate(tmplMeta); window.DD_RUM && window.DD_RUM.init({ applicationId: '95ddf222-5b92-4a62-803a-185cdd723c8b', clientToken: 'pub3fb1f7cf273c5d345be974e50be0dfda', site: 'datadoghq.com', service:'d20app', sampleRate, trackInteractions: true, version: tmplMeta.version, }); } </script> <script type="text/javascript"> // Sets a browser cookie, but only allows true or false flags function setCookie(name, value, expirationInDays) { let date = new Date(); date.setTime(date.getTime() + expirationInDays * 24 * 60 * 60 * 1000); //convert to milleseconds const expires = `expires=${date.toUTCString()}`; if (value == true || value == false) { document.cookie = `${name}=${value};${expires};path=/;domain=.roll20.net`; } else if (name == "subscriptionGiftPurchaseInfo"){ // it is a gift subscription and we need some actual values let amount = value.substring( value.indexOf("=") + 1, value.lastIndexOf("|") ) let giftToId = value.split('|giftToId=')[1]; document.cookie = `subscriptionGiftPurchaseInfo=true|amount=${amount*100}|giftToId=${giftToId};${expires};path=/;domain=.roll20.net`; }else { return undefined; } } // Gets a browser cookie value function getCookie(cname) { let name = cname + '='; let ca = document.cookie.split(';'); for(let i = 0; i < ca.length; i++) { let c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return undefined; } function checkCookieFlag(name) { let flag = getCookie(name); if (flag != undefined) { flag == 'true' ? flag = true : flag = false; } return flag; } </script> </body> </html>