CINXE.COM
Pathfinder Core Mega Bundle | Roll20 Marketplace: Digital goods 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"> <title>Pathfinder Core Mega Bundle | Roll20 Marketplace: Digital goods for online tabletop gaming</title> <meta property="og:title" content="Pathfinder Core Mega Bundle - Play on the Roll20 Virtual Tabletop" /><meta property='og:type' content='website' /> <meta property='og:url' content='https://marketplace.roll20.net/browse/bundle/29589/pathfinder-core-mega-bundle' /> <meta property='og:image' content='https://files.d20.io/marketplace/3814843/kr9hNl-iDXGErQDeLyvRdQ/med.png?1709085860170' /> <meta property="og:description" content="Play Pathfinder Second Edition Online Everything you need to run Pathfinder games will be available to you across Roll20 in the Roll20 Tabletop and in Roll20 Characters for online or in-person play..." /><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?1743100127" /> <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/js/libs/@fortawesome/fontawesome-free/css/all.min.css?1743100128" type="text/css" /> <link rel="stylesheet" href="/v2/css/fonts.css?1743100128" type="text/css" /> <link rel="stylesheet" href="/assets/v2.css?1743100128" type="text/css" /> <link rel="stylesheet" href="/v2/css/marketplace.css?1743100128" type="text/css" /> <script type="text/javascript" src="/assets/v2.js?1743100533"></script> <script type="text/javascript" src="/v2/js/browse.js?1743100128"></script> <script type="text/javascript" src="/v2/js/marketplace.js?1743100128"></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"> $(function() { $.jqotetag( '$' ); }); </script> <meta name="viewport" content="width=768" /> <link rel="icon" href="/favicon.ico" type="image/x-icon" /> <script type="text/javascript"> $('html').attr('data-theme', 'light'); </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 = "Paizo"; var _conv_product_sku = "29589"; var _conv_product_name = "Pathfinder Core Mega Bundle"; var _conv_product_price = "$99.99"; 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> <!-- 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) --> <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-v2"> <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-v2"> <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.27', }; 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> <div class="marketplacetopbar container topbar"> <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: 70%; "> <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 class="row" style="position: relative; z-index: 10000; padding-top: 20px; padding-bottom: 10px; margin-right: 0px; background-color: var(--color-surface1);"> <div class="col-md-8 logo" style="width: 275px;"> <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> <div class="row mobilemenu"> <nav class="col-md-12 btn-row"> <div class="menu-hider"></div> <div class="btn-group"> <a class="menutoggler btn btn-default" href="#" class="btn btn-default" role="button">Menu<span class="caret"></span></a> <div class="fullmobilemenu"> <ul class="nav nav-pills nav-stacked"> <li><a href="https://roll20.net/">Home</a></li> <li><a href="https://app.roll20.net/campaigns/search">My Games</a></li> <li><a href="https://app.roll20.net/lfg">Join a Game</a></li> <li><a href="https://marketplace.roll20.net/">Marketplace</a></li> <li><a href="https://app.roll20.net/characters">Characters</a></li> <li><a href="https://roll20.net/compendium">Compendium</a></li> <li><a href="https://app.roll20.net/forum">Forums</a></li> <li><a href="https://app.roll20.net/why-subscribe-to-roll20">Subscribe</a></li> <li><a href="https://roll20.zendesk.com/">Help Center</a></li> <li><a href="https://wiki.roll20.net/Main_Page">Wiki</a></li> <li><a href="http://blog.roll20.net">Blog</a></li> </ul> </div> </div> <div class="simplecontainer right topbarlogin"> <div class="btn-group signin"> <button type="button" class="btn btn-default dropdown-toggle signin" data-toggle="dropdown" aria-expanded="false"> Sign In <span class="caret"></span> </button> </div> <div class="simple signin"> <form action="https://app.roll20.net/sessions/create?backto=https://marketplace.roll20.net/browse/bundle/29589/pathfinder-core-mega-bundle" class="navbar-form form-inline" method="post"> <input name="email" type="text" placeholder="Email" aria-label="Email address"> <input name="password" type="password" placeholder="Password" aria-label="Password" autocomplete="current-password"> <button class="btn btn-primary">Sign In</button> </form> </div> </div> <div class="simplecontainer right topbarnotifications"> </div> <div class="simplecontainer right topbarsitenotifications"> <div class="btn-group alertcontainer "> <button type="button" class="btn btn-default dropdown-toggle sitenotifications " data-toggle="dropdown" aria-expanded="false" > <div class="countcontainer"> </div> <span class="pictos">:</span> </button> </div> <div class="simple sitenotifications"> <div class="notification new"> <a href="https://blog.roll20.net/posts/play-dd-2024-your-way-on-roll20/"> <div class="thumbcontainer"> <img src="/images/Notification System Icons/social-pink.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>New D&D Character Sheet Available</strong></span> <span class="short">Roll20's new D&D character sheet, which supports both 2014 and 2024 rules, is live and free for all users.</span> </div> </a> </div> <div class="notification new"> <a href="https://blog.roll20.net/posts/dd-2024-legacy-and-new-character-sheets-unite/#multiplesheets"> <div class="thumbcontainer"> <img src="https://files.d20.io/images/408806657/Cz6McatFyq96_GoqMUDEzw/thumb.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>Use Both D&D 5E Character Sheets</strong></span> <span class="short">Both classic and new D&D 5E sheets can be used in a single campaign, exclusively in Jumpgate.</span> </div> </a> </div> <div class="notification new"> <a href="https://blog.roll20.net/posts/roll20-tabletop-effects-fx-tool-now-free-for-all-users/"> <div class="thumbcontainer"> <img src="/images/Notification System Icons/plus-pink.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>Effects (FX) Tool Now Free for All! </strong></span> <span class="short">Enjoy new and optimized VTT visuals using Project Jumpgate's uplifted Effects tool. </span> </div> </a> </div> <div class="notification new"> <a href="https://app.roll20.net/characters/"> <div class="thumbcontainer"> <img src="/images/Notification System Icons/social-pink.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>Roll20 Characters: D&D + Candela Obscura</strong></span> <span class="short">D&D 5E + Candela Obscura sheets are now available in Roll20 Characters to create and manage outside the VTT.</span> </div> </a> </div> <button class="btn btn-primary btn-sm fetch_more_notifications">See More</button> </div> </div> </nav> </div> <div class="row desktopmenu"> <nav class="col-md-12 btn-row"> <div class="menu-hider"></div> <div class="btn-group"> <a href="https://app.roll20.net/" class="btn btn-default" role="button">Play Now</a> </div> <div class="btn-group"> <a href="https://app.roll20.net/lfg" class="btn btn-default" role="button">Join a Game</a> </div> <div class="btn-group drop"> <a href="https://marketplace.roll20.net" class="btn btn-default" role="button" data-toggle="dropdown" aria-expanded="false" data-hover="dropdown">Marketplace</a> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false" data-hover="dropdown" id="marketplace"> <span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> </button> </div> <div class="full"> <div class="menu"> <a href="https://marketplace.roll20.net">What's New</a> <a href="https://marketplace.roll20.net/browse">Browse</a> <a href="https://marketplace.roll20.net/gift/">Give a Gift</a> <a href="https://marketplace.roll20.net/coupon/">Redeem a Code</a> <!-- <a href="https://merchoforr.com/">Merchandise</a> --> </div> <div class="listing marketplaceitem"> <div class="inneritem"> <a href="https://marketplace.roll20.net/browse/bundle/31887/dandd-core-rulebook-bundle-2024" aria-label="D&D Core Rulebook Bundle (2024) "><img src="https://files.d20.io/marketplace/3970529/F_hjWLAuwz0TkrcIf3BxUw/med.png?1718712581469" alt="" /></a> <div class="desc"><em>D&D Core Rulebook Bundle (2024) </em> <br /> by Wizards of the Coast </div> </div> </div> <div class="listing marketplaceitem"> <div class="inneritem"> <a href="https://marketplace.roll20.net/browse/bundle/15575/dandd-curse-of-strahd" aria-label="D&D Curse of Strahd"><img src="https://files.d20.io/marketplace/3977000/dafVzdTIILuozTjInO_vEA/med.png?1719247876490" alt="" /></a> <div class="desc"><em>D&D Curse of Strahd</em> <br /> by Wizards of the Coast </div> </div> </div> <div class="listing marketplaceitem"> <div class="inneritem"> <a href="https://marketplace.roll20.net/browse/bundle/29589/pathfinder-core-mega-bundle" aria-label="Pathfinder Core Mega Bundle"><img src="https://files.d20.io/marketplace/3814843/kr9hNl-iDXGErQDeLyvRdQ/med.png?1709085860170" alt="" /></a> <div class="desc"><em>Pathfinder Core Mega Bundle</em> <br /> by Paizo </div> </div> </div> <div class="listing marketplaceitem"> <div class="inneritem"> <a href="https://marketplace.roll20.net/browse/bundle/13881/cyberpunk-red" aria-label="Cyberpunk RED"><img src="https://files.d20.io/marketplace/2804303/qu8j0OPMgC21GjOtNunYzw/med.jpeg?1667917715094" alt="" /></a> <div class="desc"><em>Cyberpunk RED</em> <br /> by R. Talsorian Games </div> </div> </div> </div> <div class="btn-group drop"> <a href="https://roll20.net/compendium/" class="btn btn-default" role="button" data-toggle="dropdown" data-hover="dropdown" aria-expanded="false">Tools</a> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" aria-expanded="false" id="digitaltools"> <span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> </button> </div> <div class="full"> <div class="menu"> <a href="https://roll20.net/compendium/">Compendium</a> <a href="https://app.roll20.net/characters/">Characters</a> <a href="https://app.roll20.net/audio_library/">Manage Audio</a> <a href="https://app.roll20.net/marker-library">Token Marker Library</a> <a href="https://pages.roll20.net/companionapp">Roll20 Companion App</a> <a href="https://pages.roll20.net/dnd/">D&D Hub</a> <a href="https://pages.roll20.net/marvel-multiverse">Marvel Hub</a> <a href="https://gmhub.roll20.net/">GM Hub</a> <a href="https://dungeonscrawl.com/">Dungeon Scrawl</a> <a href="https://app.demiplane.com/home" class="dropdown-item">Demiplane</a> </div> <div class="listing"> <div class="imgcontainer"> <a href="https://app.roll20.net/characters/"> <img src="/images/Roll20Characters-TopNav.jpg" alt="Characters"> </a> </div> <div class="gameinfo"> <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 class="listing"> <div class="imgcontainer"> <a href="https://roll20.net/compendium/"> <img src="/images/banner-compendium.jpg" alt="Compendium"> </a> </div> <div class="gameinfo"> <a href="https://roll20.net/compendium/">Compendium</a> <div class="shorthr"></div> <span class="gameinfo">Your System Come To Life</span> </div> </div> <div class="listing"> <div class="imgcontainer"> <a href="https://app.roll20.net/vault/characters"> <img src="/images/banner-character-vault.jpg" alt="Character Vault"> </a> </div> <div class="gameinfo"> <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 class="listing"> <div class="imgcontainer"> <a href="https://dungeonscrawl.com"> <img src="/images/banner-dungeonscrawl.png" alt="Dungeon Scrawl"> </a> </div> <div class="gameinfo"> <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 class="btn-group drop"> <a href="https://app.roll20.net/forum/" class="btn btn-default community-toggler" role="button" data-toggle="dropdown" data-hover="dropdown" aria-expanded="false">Community</a> <button type="button" class="btn btn-default dropdown-toggle community community-toggler" data-toggle="dropdown" data-hover="dropdown" aria-expanded="false" id="community"> <span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> </button> </div> <div class="full community"> <div class="menu"> <a href=" https://blog.roll20.net/">Blog</a> <a href="https://roll20.net/help" target="_blank">Help Center</a> <a href="https://roll20.zendesk.com/hc/articles/360037772613-Change-Log" target="_blank">Change Log</a> <a href="https://app.roll20.net/forum/">Forums</a> <a href="https://wiki.roll20.net/Main_Page" class="dropdown-item">Community Wiki</a> <a href="http://www.twitch.tv/roll20app" target="_blank">Live Stream</a> <a href="https://www.youtube.com/roll20app" target="_blank">VODs</a> <a href="https://pages.roll20.net/ambassador-program" target="_blank">Ambassador Program</a> </div> <div class="listing"> <div class="imgcontainer"> <a href="https://blog.roll20.net/posts/the-new-roll20-tabletop-fast-free-and-stunning/"> <img src="https://files.d20.io/images/406055047/NBEegvOJ3pSZYTXXhId6xQ/original.jpg?1724188557376" alt="The New Roll20 Tabletop" /> </a> </div> <p class="snippet"> <a href="https://blog.roll20.net/posts/the-new-roll20-tabletop-fast-free-and-stunning/"> The New Roll20 Tabletop </a> </p> </div> <div class="listing"> <div class="imgcontainer"> <a href="https://blog.roll20.net/posts/roll20-discord-activity/"> <img src="https://files.d20.io/images/406055142/WxdDedtmZSm7uIUVGANdzg/original.jpg?1724188591159" alt="Play Roll20 on Discord" /> </a> </div> <p class="snippet"> <a href="https://blog.roll20.net/posts/roll20-discord-activity/"> Play Roll20 on Discord </a> </p> </div> <div class="listing"> <div class="imgcontainer"> <a href="https://app.roll20.net/characters/create/dnd2024byroll20"> <img src="https://files.d20.io/images/409822399/wtLMqDnqy0jvxjxvOYtaPw/original.jpg?1726541310739" alt="Play D&amp;D 2024" /> </a> </div> <p class="snippet"> <a href="https://app.roll20.net/characters/create/dnd2024byroll20"> Play D&D 2024 </a> </p> </div> <div class="listing"> <div class="imgcontainer"> <a href="https://blog.roll20.net/posts/roll20-has-acquired-demiplane/"> <img src="https://files.d20.io/images/406056058/6P2sO-_xeNWhbSgKpW7rcw/original.jpg?1724189145614" alt="Demiplane Joins Roll20" /> </a> </div> <p class="snippet"> <a href="https://blog.roll20.net/posts/roll20-has-acquired-demiplane/"> Demiplane Joins Roll20 </a> </p> </div> </div> <div class="btn-group" id="optlysub"> <a href="https://app.roll20.net/why-subscribe-to-roll20" class="btn btn-default" role="button" >Subscribe</a> </div> <div class="simplecontainer right topbarlogin"> <div class="btn-group signin"> <button type="button" class="btn btn-default dropdown-toggle signin" data-toggle="dropdown" aria-expanded="false"> Sign In <span class="caret"></span> </button> </div> <div class="simple signin"> <form action="https://app.roll20.net/sessions/create?backto=https://marketplace.roll20.net/browse/bundle/29589/pathfinder-core-mega-bundle" class="navbar-form form-inline" method="post"> <input name="email" type="text" placeholder="Email" aria-label="Email address"> <input name="password" type="password" placeholder="Password" aria-label="Password" autocomplete="current-password"> <button class="btn btn-primary">Sign In</button> </form> </div> </div> <div class="simplecontainer right topbarnotifications"> </div> <div class="simplecontainer right topbarsitenotifications"> <div class="btn-group alertcontainer "> <button type="button" class="btn btn-default dropdown-toggle sitenotifications " data-toggle="dropdown" aria-expanded="false" > <div class="countcontainer"> </div> <span class="pictos">:</span> </button> </div> <div class="simple sitenotifications"> <div class="notification new"> <a href="https://blog.roll20.net/posts/play-dd-2024-your-way-on-roll20/"> <div class="thumbcontainer"> <img src="/images/Notification System Icons/social-pink.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>New D&D Character Sheet Available</strong></span> <span class="short">Roll20's new D&D character sheet, which supports both 2014 and 2024 rules, is live and free for all users.</span> </div> </a> </div> <div class="notification new"> <a href="https://blog.roll20.net/posts/dd-2024-legacy-and-new-character-sheets-unite/#multiplesheets"> <div class="thumbcontainer"> <img src="https://files.d20.io/images/408806657/Cz6McatFyq96_GoqMUDEzw/thumb.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>Use Both D&D 5E Character Sheets</strong></span> <span class="short">Both classic and new D&D 5E sheets can be used in a single campaign, exclusively in Jumpgate.</span> </div> </a> </div> <div class="notification new"> <a href="https://blog.roll20.net/posts/roll20-tabletop-effects-fx-tool-now-free-for-all-users/"> <div class="thumbcontainer"> <img src="/images/Notification System Icons/plus-pink.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>Effects (FX) Tool Now Free for All! </strong></span> <span class="short">Enjoy new and optimized VTT visuals using Project Jumpgate's uplifted Effects tool. </span> </div> </a> </div> <div class="notification new"> <a href="https://app.roll20.net/characters/"> <div class="thumbcontainer"> <img src="/images/Notification System Icons/social-pink.png" alt="Notifications"> </div> <div class="message"> <span class="title"><strong>Roll20 Characters: D&D + Candela Obscura</strong></span> <span class="short">D&D 5E + Candela Obscura sheets are now available in Roll20 Characters to create and manage outside the VTT.</span> </div> </a> </div> <button class="btn btn-primary btn-sm fetch_more_notifications">See More</button> </div> </div> </nav> </div> </div> <script type="text/javascript"> $(".signin input").click(function() { return false; }); $("body, .simplecontainer").on("click", ".full, .simplecontainer .simple", function(e) { e.stopPropagation(); }); $(".menutoggler").on("click", function() { $(".mobilemenu").addClass("open"); return false; }); $(document).on("click", function() { $(".mobilemenu").removeClass("open"); }); if('ontouchstart' in document) { //touch-compatible } else { //mouse-compatible $(".topbar .btn-group a.btn[data-toggle=dropdown]").removeAttr("data-toggle"); $('[data-hover="dropdown"]').dropdownHover({hoverDelay: 100, delay: 300}); } var trackOutboundLink = function(url) { ga('send', 'event', 'outbound', 'obsAdvert', '', { 'transport': 'beacon', 'hitCallback': function(){document.location = url;} }); } $(function() { setTimeout(function(){ if($(".obs_container").length > 0) { // GA Event Tracking ga('send', { 'hitType': 'event', 'eventCategory': 'obsAdvert', 'eventAction': 'topbar', 'eventLabel': '' }); } }, 0); }); if(window.dataLayer) { dataLayer.push({ 'event': 'start_pw'}); } </script> <div class="container marketplace product" data-itemid="29589"> <h1 class="sr-only">Roll20 Marketplace Product</h1> <div class="showcase"> <div class="previewimages"> <img src="https://files.d20.io/marketplace/3814843/kr9hNl-iDXGErQDeLyvRdQ/med.png?1709085860170" dragable="false" alt=""/> <div class="carosel"> <span class="prev control" tab-index="0"></span> <div class="previewimage marketplaceitem"> </div> <div class="previewimage marketplaceitem"> </div> <div class="previewimage marketplaceitem"> </div> <div class="previewimage marketplaceitem"> </div> <div class="previewimage marketplaceitem"> </div> <div class="previewimage marketplaceitem"> </div> <div class="previewimage marketplaceitem"> </div> <span class="next control" tab-index="0"></span> </div> </div> <div class="titlecard db-title-card"> <h2 data-itemid="29589">Pathfinder Core Mega Bundle</h2> <div id="purchase_box db-purchase-box"> <div class="dynamic-price-box-outer"> <div class="dynamic-price-box-frame"> <div class="db-frame-inner"> <div class="dynamic-b-title-and-author"> <span class="author db-author"> Author: <a href="/browse/publisher/281">Paizo</a> </span> <div class="create db-create-desc"> <p>Bundle: A combination of content. Prices are discounted based on what you already own. More detail on each item is below.</p> </div> </div> <div class="db-vertical-break"></div> <div class="dynamic-price-breakdown-outer"> <span class="loading-skeleton dynamic-pricing-loading"></span> <span class="loading-skeleton dynamic-pricing-loading"></span> <div class="dynamic-pricing-div" style="display:none;"> <div class="price-row"> <span class="price-item-one"> List Price: </span> <span class="price-amount"></span> </div> </div> </div> </div> <div class="dynamic-b-button-group" style="display:none;"> </div> <button class="btn btn-lg loading-skeleton button-loading"></button> </div> </div> </div> </div> <script type="text/javascript"> const owned_items = "[]"; const item_id = 29589; const item_discount_percent = 1664; // this means the item has a sale for a certain percentage off (i.e. 20% off) const item_is_dynamically_priced = true; // this means the item has a dynamic price (i.e. a bundle) $(document).ready(function() { getDynamicPricingInfo(); }); function getDynamicPricingInfo(){ $.ajax({ type: 'GET', url: `/browse/bundle_pricing_info/${item_id}`, dataType: 'json', }).success((response) => { // Set base price $(".price-amount").text(response.formatted_bundle_price) // if the user owns some but not all of the sub items in the bundle, and is_base_price is false, strike through the formatted price of the bundle's price including all sub items !response.unowned_items_empty && !response.is_base_price ? $(".price-amount").addClass("strike-price") : $(".price-amount").addClass("reg-price") // Set "Your Price" or "All Bundle Items Owned" text if (response.total_bundle_price != response.remaining_items_price){ // if the total price of the bundle including all sub items does not match the price of the bundle including sub items that the user does own, show the dynamic price %> let discountInnerHtml; if (!response.unowned_items_empty){ // if the user owns some but not all of the sub items in the bundle, show the price which includes the sub items they do not own discountInnerHtml = `<div class="price-row"><div class="db-owned-discount-inner"> <div class="db-owned-discount"> <span class="db-owned-label">Your Price</span> </div> </div> <span class="db-unowned-amount">$${ response.remaining_items_price.toFixed(2) }</span> </div>` }else{ // Otherwise, they own all of the items discountInnerHtml = `<div class="price-row"><div class="db-owned-discount-inner"> <div class="db-save-percent"> <span class="db-save-text">All bundle items owned</span> </div> </div> </div>` } $(".dynamic-pricing-div").append(discountInnerHtml) } // Set percentage off, if on sale if (item_discount_percent > 0 && !response.unowned_items_empty){ // if the item does have a sale, and the user does not own all of the sub items, show the percentage they will save $(".dynamic-pricing-div").append(`<div class="price-row"> <div class="db-save-outer"> <div class="db-save-percent"> <span class="db-save-text">Save ${Math.round(item_discount_percent / 100)}%</span> </div> </div> </div>`) } // if the user does not own all of the sub items, and there is no sale going on, show the discounted price of the bundle as "Bundle Price" %> if (!response.unowned_items_empty && !response.is_base_price){ $(".dynamic-pricing-div").append(`<div class="price-row"> <span class="db-you-save">Bundle Price:</span> <span class="db-your-price">$100.00</span> </div>`) } let buttonHtml = ""; const current_account_is_nil = true; const item_event_active = false; const marketplace_event = "false"; const total_cost = 100.0; const item_active = true; const item_notforsale = false; const user_did_purchase = false; const is_purchasable = !user_did_purchase && !response.unowned_items_empty; if (current_account_is_nil){ buttonHtml = `<a class="btn btn-default btn-lg db-login-button db-buy-text calltoaction showtip" style="display: block; width: 100%; flex-grow: 1; flex-shrink: 1;" href="https://app.roll20.net/login?backto=https://marketplace.roll20.net/browse/bundle/29589/pathfinder-core-mega-bundle" title="Create a free Roll20 Account (or sign in if you've already got one) to purchase or gift this item." type="button">Sign In</a>`; }else if(item_event_active){ }else if(!item_active || item_notforsale){ buttonHtml += `<button class="btn btn-default btn-lg showtip db-no-sale disabled" type="button" title="This item is still available to those who have already purchased it, but is no longer available for sale."> Not For Sale </button>` }else if(total_cost == 0 && !user_did_purchase && !response.unowned_items_empty){ buttonHtml += `<button class="btn btn-lg create-game-button showtip free db-buy-button db-buy-text" type="button" title="This Bundle is free to use. Click here to start a new game using this Bundle.">Free Bundle</button>` }else{ buttonHtml += `<div class="db-gift-outer">` buttonHtml += `<button class="btn db-gift-button" type="button" data-toggle="modal" data-target="#paymentmodal"> <span class="db-gift-icon" aria-hidden="true"></span> <span class="db-gift-text"> Gift </span> </button>` buttonHtml += `</div> <div class="db-buy-outer">` if (is_purchasable){ buttonHtml += `<button class="btn purchase db-buy-button" data-toggle="modal" data-target="#paymentmodal" type="button" > <span class="db-buy-text">Buy Now</span> </button>` }else{ buttonHtml += `<button class="btn disabled owned db-owned-button" type="button"> <span class="db-buy-text">Owned</span> </button>` } buttonHtml += `</div>`; } $(".dynamic-b-button-group").append(buttonHtml); $(".loading-skeleton").hide(); // Since the wishlist dropdown is appended to the DOM after page load, we have to call this function to list out the wishlists here. wishlists functions are defined in _itemjs.erb and accesible here rebuildWishlists(); $(".dynamic-b-button-group").show(); $(".dynamic-pricing-div").show(); // We have to add the event handler here since its not accessible in _itemjs.erb since the buttons are appended to the DOM after page load $(".wishlist-dropdown").on("click", "li.wl:not(.disabled)", function() { let values = { itemid: 29589, listid: $(this).data("listid") } $.ajax({ url: `/wishlist/additem`, data: values, type: 'post', dataType: 'json' }).success(function(data) { wishlists = data; rebuildWishlists(); createAlert('Item added to wishlist.'); }).fail(function (jqXHR, textStatus, errorThrown){ alert("Failed: " + jqXHR); }); }); // Add event handler here to select "Gift to Player" in payment modal since the buttons are appended to the DOM after page load $(".db-gift-button").on("click", function(e) { setGiftButton(); }); // Add event handler here to select "Claim" in payment modal since the buttons are appended to the DOM after page load $("button.claim").on("click", function(e) { let itemid = 29589; let itemtype = "Bundle"; $.post(`/batch/claimItem/${itemtype.toLowerCase()}/${itemid}`, function() { window.location.reload(); }); }); //Add event handler here to select "Create Game" in payment modal since the buttons are appended to the DOM after page load $("button.create-game-button").on("click", function(){ let itemid = 29589; let itemtype = "Bundle"; if(itemtype == "Module"){ window.location.href="https://app.roll20.net/campaigns/new?module=" + itemid }else if(itemtype == "GameAddon"){ window.location.href="https://app.roll20.net/campaigns/new?gameaddon=" + itemid }else{ window.location.href="https://app.roll20.net/campaigns/new" } }); $("button.reserve").on("click", function(){ window.location.href = "https://roll20.net/reserve" }); }).error(error => { console.log(error) }); } </script> <script> const item_is_external = false if (item_is_external){ $(".dynamic-b-title-and-author").css('width', 'auto'); } </script> <style> .dynamic-pricing-loading{ padding: 1rem; border-radius: 4px; } .dynamic-pricing-div{ display: flex; gap: 8px; flex-direction: column; } @media (max-width: 991px) { .dynamic-pricing-loading{ margin-top: none; } } .button-loading{ padding: 2rem; } .loading-skeleton{ width: 100%; animation: skeleton-loading 1s linear infinite alternate; } @keyframes skeleton-loading { 0% { background-color: var(--skeleton-light); } 100% { background-color: var(--skeleton-dark); } } </style> </div> <div class="itemdescription"> <h4> This Bundle Includes: </h4> <div class="shelf"> <div class="display bundle-card-display"> <div class="block bundle-card-outer" style="max-width: 20%"> <a class="item bundle-card-inner" href="https://marketplace.roll20.net/browse/bundle/26273/pathfinder-player-core"> <img class="bundle-card-image" alt="Pathfinder Player Core" src="https://files.d20.io/marketplace/3676956/vQBBDGkskKUBFJ7SeBKE4w/med.jpg?1700071496003" title="Pathfinder Player Core"/> <p class="desc" title="Pathfinder Player Core"> <em> Pathfinder Player Core </em> </p> <div class="bundle-card-price-row"> <p class="bundle-card-list-price">29.99</p> <p class="bundle-card-arrow">➜</p> <p class="bundle-card-new-price">25.00</p> <p class="bundle-card-price-desc">Bundle Price</p> </div> </a> </div> <div class="block bundle-card-outer" style="max-width: 20%"> <a class="item bundle-card-inner" href="https://marketplace.roll20.net/browse/bundle/26274/pathfinder-gm-core"> <img class="bundle-card-image" alt="Pathfinder GM Core" src="https://files.d20.io/marketplace/3676971/vnDApvBsVHcjHGuvjI-npw/med.jpg?1700072038196" title="Pathfinder GM Core"/> <p class="desc" title="Pathfinder GM Core"> <em> Pathfinder GM Core </em> </p> <div class="bundle-card-price-row"> <p class="bundle-card-list-price">29.99</p> <p class="bundle-card-arrow">➜</p> <p class="bundle-card-new-price">25.00</p> <p class="bundle-card-price-desc">Bundle Price</p> </div> </a> </div> <div class="block bundle-card-outer" style="max-width: 20%"> <a class="item bundle-card-inner" href="https://marketplace.roll20.net/browse/bundle/29515/pathfinder-monster-core"> <img class="bundle-card-image" alt="Pathfinder Monster Core" src="https://files.d20.io/marketplace/3784773/NhuRsO2Xw8CITxW-MOXPYQ/med.jpg?1707438122415" title="Pathfinder Monster Core"/> <p class="desc" title="Pathfinder Monster Core"> <em> Pathfinder Monster Core </em> </p> <div class="bundle-card-price-row"> <p class="bundle-card-list-price">29.99</p> <p class="bundle-card-arrow">➜</p> <p class="bundle-card-new-price">25.00</p> <p class="bundle-card-price-desc">Bundle Price</p> </div> </a> </div> <div class="block bundle-card-outer" style="max-width: 20%"> <a class="item bundle-card-inner" href="https://marketplace.roll20.net/browse/bundle/29516/pathfinder-player-core-2"> <img class="bundle-card-image" alt="Pathfinder Player Core 2" src="https://files.d20.io/marketplace/3790576/hRlvkKfJhYMyFktHpSOu9g/med.png?1707871965794" title="Pathfinder Player Core 2"/> <p class="desc" title="Pathfinder Player Core 2"> <em> Pathfinder Player Core 2 </em> </p> <div class="bundle-card-price-row"> <p class="bundle-card-list-price">29.99</p> <p class="bundle-card-arrow">➜</p> <p class="bundle-card-new-price">25.00</p> <p class="bundle-card-price-desc">Bundle Price</p> </div> </a> </div> </div> </div> <p><h1>Play Pathfinder Second Edition Online</h1> <p>Everything you need to run Pathfinder games will be available to you across Roll20 in the Roll20 Tabletop and in Roll20 Characters for online or in-person play.</p> <h3>Save 16% when you purchase this bundle!</h3> <p>This bundle includes:</p> <p><a href="https://marketplace.roll20.net/browse/bundle/26273/pathfinder-player-core">Pathfinder Player Core</a><br/> <a href="https://marketplace.roll20.net/browse/bundle/26274/pathfinder-gm-core">Pathfinder GM Core</a><br/> <a href="https://marketplace.roll20.net/browse/bundle/29515/pathfinder-monster-core">Pathfinder Monster Core</a><br/> <a href="https://marketplace.roll20.net/browse/bundle/29516/pathfinder-player-core-2-pre-order">Pathfinder Player Core 2</a></p> <h2>Interested in Pathfinder content on both Roll20 and Demiplane? <a href="https://app.demiplane.com/nexus/pathfinder2e/sources">Purchase the core books on Demiplane</a> to get full access across both platforms!</h2> <h2>Player Core</h2> <p>Choose from eight ancestries, eight complete character classes, and hundreds of feats and spells to make unique characters ready for deadly adventures in a world beset by magic and evil! This tome is fully converted for digital play, including 480 digital tokens, and is the definitive rules resource for all Pathfinder Second Edition players!</p> <h2>GM Core</h2> <p>This comprehensive rulebook gives Game Masters everything they need to craft thrilling tales of adventure, from a single-night’s dungeon delve to complex epics spanning years. Within these pages you’ll find clear guidelines for creating new hazards and monsters, tools to design challenging, balanced encounters, and rules for rewarding characters for the dastardly challenges you array before them! Pathfinder GM Core also contains a dragon’s hoard of magic items and treasure to entice and reward your players, from simple healing potions to magic weapons and armor and legendary artifacts!</p> <h2>Monster Core</h2> <p>Heroes are defined by their foes—from shambling skeletons to terrifying dragons, each enemy leaves a mark on their growing legend. Make your legends memorable with foes from the new Pathfinder Monster Core rulebook for Pathfinder Second Edition – packed with a wide range of monsters useful to all Pathfinder campaigns, giving the Game Master plenty of threats to throw at their adventurers, at any level of experience. The lavishly illustrated tome (1500+ digital tokens!) also includes guidelines for reading monster entries and adjusting existing monsters to tailor fit your story! This is the definitive resource for Pathfinder Second Edition monsters!</p> <h2>Player Core 2</h2> <p>8 fully detailed classes, including the alchemist, barbarian, champion, investigator, monk, oracle, sorcerer, and swashbuckler, each containing dozens of feats! Expanded ancestry options including catfolk, gnoll, hobgoblin, kobold, lizardfolk, ratfolk, and tengu, alongside three versatile heritages—the dhampir, duskwalker, and an all-new heritage! 40+ archetypes, allowing you to further customize your character’s story and abilities. Turn your hero into an aerial acrobat, a high-riding cavalier, a treacherous pirate, and more.</p> <hr/> <p>Buy the PDFs versions from <a href="https://paizo.com/pathfinder">Paizo</a>!</p> </p> <div class="alert alert-info"> <span class="pictos" style="font-size: 1.2em;">i</span> Can only be used with Roll20; cannot be downloaded. </div> <hr/> <h4>You might also like...</h4> <div id="recommendations_section"> </div> <p style="margin-top: 10px;"> License: <a href="https://roll20.zendesk.com/hc/articles/360037254294-Marketplace-Asset-EULA" target="_blank">Roll20 End User License Agreement</a> <br/> (Personal Use Only, Do Not Distribute) </p> </div> </div> <script type="text/javascript" src="/js/datetimepicker/bootstrap-datetimepicker.js?v=2"></script> <script type="text/javascript"> window.purchaseinfo = { cost: "100.0" } window.subinfo = { accountid: "0", plan: "no_account", cost: "100.0", giftCost: "100.0", discountedCost: "100.0", skuid: "29589", itemname: "Pathfinder Core Mega Bundle" }; </script> <script> !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '965703233507832'); fbq('track', "PageView"); </script> <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1227306170742345&ev=PageView&noscript=1"/></noscript> <script type="text/javascript"> $(document).ready(() => { const itemid = 29589; $.ajax({ url: `/browse/recommendations/${itemid}`, }).success((data, statusCode, jqXHR) => { const recommendations = JSON.parse(data); let resultString = '' for(const result of recommendations) { const image = result['image'] .replace('s3.amazonaws.com/files.d20.io', 'files.d20.io') .replace('s3.amazonaws.com/files.staging.d20.io', 'files.staging.d20.io'); resultString += ` <div class="block" style="max-width: 20%"> <a class="item" href="${result['url'].replace('s3.amazonaws.com/files.d20.io', 'files.d20.io')}"> <img alt="${result['name']}" src="${ image }" style="width: 200px;"/> <p class="desc"> <em> ${result['name']} </em> <span></span> </p> </a> </div> `; } const element = ` <div class="shelf"> <div class="display" style="width:100%"> ${resultString} </div> </div> `; $('#recommendations_section').append(element); }).fail(() => { console.log("Error retrieving recommended items."); }); }); $(".db-gift-button").on("click", function(e) { setGiftButton(); }); $("#fulfill-preorder").on("click", function(e) { const itemid = 29589; const data = {itemid: itemid}; $.ajax({ url: `/browse/fulfill_preorder/${itemid}`, method: 'POST', data, }).success((data, statusCode, jqXHR) => { const result = JSON.parse(data); $("#preorderReleaseModal").modal(); checkReleaseStatus(result.job_id); }).fail((data) => { error = data.responseText; $("#preorderReleaseModal").modal(); const $modal = $("#preorderReleaseModal .modal-body"); $modal.find(".status").html(`The following error occurred while attempting to fulfilling this pre-order, please notify a Developer. ${error}`); }); }); const checkReleaseStatus = function(jobId) { $.ajax({ url: `/browse/fulfill_preorder/${jobId}`, type: 'GET', }).done(function(queueData) { const $modal = $("#preorderReleaseModal .modal-body"); const queueResponse = JSON.parse(queueData); const message = queueResponse.msg === "" ? {} : JSON.parse(queueResponse.msg); switch(queueResponse.status){ case 'WAIT': $modal.find(".status").html(`Waiting in line, position number ${queueResponse.line}.`); setTimeout(checkReleaseStatus, 1000, jobId); break; case 'WORK': $modal.find(".status").html(`Processing preorders: order ${message.fulfilled} of ${message.total}. ${message.errored} errors.`); setTimeout(checkReleaseStatus, 1000, jobId); break; case 'DONE': $modal.find(".status").html(`Order fulfillment complete! ${message.fulfilled} orders processed.`); break; case 'ERR': $("#preorderReleaseModal").modal('hide'); swal.fire({ icon: 'error', title: 'Pre-Order Release Error', text: `The following error occurred while fulfilling this pre-order, please notify a Developer. ${message.error}`, confirmButtonText: 'Okay', customClass: { confirmButton: 'btn btn-primary', }, }); break; } }); }; $(".btn-lg.gift").on("click", function(e) { $("#for-recent").prop("checked", true); $('.paymentform .recent-select').slideDown(); updateDisplayedCost(); }); $("button.claim").on("click", function(e) { let itemid = 29589; let itemtype = "Bundle"; $.post(`/batch/claimItem/${itemtype.toLowerCase()}/${itemid}`, function() { window.location.reload(); }); }); $("button.reserve").on("click", function(){ window.location.href = "https://roll20.net/reserve" }); $("button.create-game-button").on("click", function(){ let itemid = 29589; let itemtype = "Bundle"; if(itemtype == "Module"){ window.location.href="https://app.roll20.net/campaigns/new?module=" + itemid }else if(itemtype == "GameAddon"){ window.location.href="https://app.roll20.net/campaigns/new?gameaddon=" + itemid }else{ window.location.href="https://app.roll20.net/campaigns/new" } }); $("button.db-compendium-button").on("click", function(){ window.location.href="https://app.roll20.net/compendium/"; }); $("button.token-marker-library").on("click", function(){ window.location.href="https://app.roll20.net/marker-library"; }); const description_is_valid = () => { const description = $("textarea[name=description]").val(); return description.length > 0; }; const update_description_validation_message = () => { if (description_is_valid()) { $(".description .validation-error").hide(); $("textarea[name=description]").removeClass("invalid-input"); } else { $(".description .validation-error").show(); $("textarea[name=description]").addClass("invalid-input"); } }; $('#editItem').on('click', function(e) { e.preventDefault(); var olddesc = []; _.each($(".origdesc").text().split("\n"), function(line) { olddesc.push($.trim(line)); }); $(".description textarea").html(olddesc.join("\n")); update_description_validation_message(); $(".adminItemEdit").show(); $(".adminFilterEdit").show(); $('.itemdescription').hide(); $(".edit-item").hide(); $(".edit-cancel").show(); window.scroll(0,0); }); $("button.cancelEdit").on("click", function() { window.location.reload(); }); // Wishlists var wishlists = []; var rebuildWishlists = function() { let lists = ""; $(".wishlist-dropdown li.wl").remove(); _.each(wishlists, function(list) { lists += `<li class="wl ${list.items.includes(29589) ? "disabled" : ""}" data-listid="${list.id}">`; lists += `<a href="javascript:void(0)" class="dropdown-item wishlist-dropdown-item"><div class="d-flex justify-content-between"><div>`; lists += `<div class="wishlist-dropdown-item__title d-block">${list.name}</div>`; lists += `<div class="wishlist-dropdown-item__privacy small">${list.public ? "Public" : "Private"}</div>`; if(list.items.includes(29589)) lists += `<div class="wishlist-dropdown-item__privacy text-primary">Item already in wishlist</div>`; lists += `</div><div>`; lists += `<div class="wishlist-dropdown-item__items small">${"{{0}} items".replace("{{0}}", list.items.length)}</div></div></div></a></li>`; }); $(".wishlist-dropdown ul div.scrollable").prepend(lists); }; $(".wishlist-dropdown").on("click", "li.wl:not(.disabled)", function() { let values = { itemid: 29589, listid: $(this).data("listid") } $.ajax({ url: `/wishlist/additem`, data: values, type: 'post', dataType: 'json' }).success(function(data) { wishlists = data; rebuildWishlists(); createAlert('Item added to wishlist.'); }).fail(function (jqXHR, textStatus, errorThrown){ alert("Failed: " + jqXHR); }); }); $(document).ready(function() { rebuildWishlists(); }); function createAlert(message) { var alertEl = $('<div class="position-fixed position-br wishlist-alert"><div class="alert alert-dismissible alert-success">' + '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + '×</button>' + message + '</div></div>').hide().fadeIn(500); $('body').append(alertEl); window.setTimeout(function () { $(".wishlist-alert").fadeOut(500, function () { $(this).remove(); }); }, 3000); } </script> <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="Dungeon Scrawl Logo"/> </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; } 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: 7rem; } .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: 68%; } .all-logos img{ padding-right: 3rem; } /* 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; } .powered-by { padding: 2rem 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: 50%; padding-left: 0; } .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%; padding: 0 1.2rem 0 1.2rem; } .section-content a{ color: var(--color-primary-text); } .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; } } </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; }); </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"> $("#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() { let notid = $(this).attr("data-notification-id"); let othis = this; $.getJSON("https://app.roll20.net/notifications/dismiss/" + notid + "/?callback=?", function(data) { if(notid == "all") { $(othis).parents(".notifications").fadeOut(); $(".alertcount").html(""); $(".topbarnotifications .alertcontainer").html("<a href='https://app.roll20.net/private_message/inbox/' class='btn btn-default pictos' role='button' style='color:#555'>M</a>") return; } if($(othis).attr("href")) { window.location = "https://app.roll20.net" + $(othis).attr("href"); } else { $(othis).parents(".notification").fadeOut(); let $count = $(othis).parents(".notifications").find("a .count"); let 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 .alertcontainer").html("<a href='https://app.roll20.net/private_message/inbox/' class='btn btn-default pictos' role='button' style='color:#555'>M</a>") return; } } }); return false; }); $(".topbarsitenotifications .newalerts button").on("click", function() { }); $(".topbarsitenotifications .sitenotifications button.fetch_more_notifications").on("click", function() { window.location = "https://app.roll20.net/sitenotifications"; }); </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>