{"id":10,"date":"2026-06-16T23:38:28","date_gmt":"2026-06-16T23:38:28","guid":{"rendered":"https:\/\/talltale.games\/?page_id=10"},"modified":"2026-07-18T23:47:48","modified_gmt":"2026-07-19T03:47:48","slug":"register","status":"publish","type":"page","link":"https:\/\/talltale.games\/register\/","title":{"rendered":"Registration"},"content":{"rendered":"<script>window.HD_AJAX_URL = window.HD_AJAX_URL || \"https:\\\/\\\/talltale.games\\\/hdadmin\\\/hdajax.php\";if (typeof window.ajaxurl === \"undefined\") { window.ajaxurl = window.HD_AJAX_URL; }<\/script>\n<style>\n\tlabel.input_error {\n\t\tborder: 1px solid var(--crimson) !important;\n\t}\n\t\n    .hd_input_row {\n        padding: 0 0.4em;\n    }\n    .hd_options_check {\n        display: inline-block;\n        margin-right: 12px;\n        position: relative;\n    }\n\n    .hd_options_check input[type=\"checkbox\"] {\n        position: absolute;\n        opacity: 0;\n    }\n\n    .hd_options_check .hd_toggle {\n        width: 2em;\n        height: 1em;\n        position: relative;\n        cursor: pointer;\n        display: block !important;\n        font-size: 22px !important;\n        margin: 0;\n\t\ttop: 4px;\n    }\n\n    .hd_input_radio .hd_options_check input[type=\"checkbox\"]:checked+.hd_toggle::before {\n        background: darkseagreen;\n        box-shadow: inset 0px 1px 1px rgb(84 152 140 \/ 50%);\n    }\n\n    .hd_input_radio .hd_options_check input[type=\"checkbox\"]:checked+.hd_toggle::after {\n        left: 1.1em;\n        background: #efefef;\n\n    }\n\n    .hd_input_radio .hd_options_check .hd_toggle::before {\n        content: \"\";\n        position: absolute;\n        width: 100%;\n        height: 100%;\n        left: 0.1em;\n        transition: background 0.1s ease;\n\n        background: #f25f5c;\n        border-radius: 50px;\n\n        box-shadow: inset 0px 1px 1px rgb(171 171 171 \/ 50%);\n    }\n\n    .hd_aria_label {\n        display: none !important;\n    }\n\n    .hd_input_radio .hd_options_check .hd_toggle::after {\n        content: \"\";\n        position: absolute;\n        width: calc(1em - 4px);\n        height: calc(1em - 4px);\n        border-radius: 50px;\n        left: 0;\n        transition: all 0.2s ease;\n        box-shadow: 0 0 1px 1px rgb(0 0 0 \/ 50%);\n        background: #efefef;\n        z-index: 2;\n        border: 2px solid transparent;\n    }\n\t\n\t#hd_final{\n\tdisplay: grid;\n\t  grid-template-columns: 1fr max-content;\n\t  justify-items: end;\n\t  gap: 2rem;\n\t  align-items: anchor-center;\n\t}\n<\/style>\n<div id=\"hd_registration_form\">\n    <div class=\"hd_field_item\">\n        <label for=\"hd_registration_email\">Your email<\/label>\n        <input type=\"email\" id=\"hd_registration_email\" name=\"hd_registration_email\" placeholder=\"...\" value=\"\">\n    <\/div>\n    <div class=\"hd_field_item\">\n        <div id=\"hd_registration_type\" data-value=\"player\">\n            <div class=\"hd_registration_toggle_item active\" id=\"hd_registration_type_player\" data-id=\"player\">\n                <span class=\"hd_registration_toggle_item_title\">Player<\/span>\n                <span class=\"hd_registration_toggle_item_price\">FREE<\/span>\n                <ul class=\"pricing_features\">\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#00d4e8\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#00d4e8\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Join any game room via invite link\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#00d4e8\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#00d4e8\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Roll all dice \u2014 D4 through D20\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#00d4e8\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#00d4e8\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Draw and annotate on the whiteboard\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#00d4e8\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#00d4e8\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Save character profiles\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#00d4e8\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#00d4e8\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Real-time sync with your entire party\n                    <\/li>\n                <\/ul>\n            <\/div>\n            <div class=\"hd_registration_toggle_item\" id=\"hd_registration_type_gm\" data-id=\"gm\">\n                <span class=\"hd_registration_toggle_item_title\">Game Master<\/span>\n                <span class=\"hd_registration_toggle_item_price\">$10\/year<\/span>\n\n                <ul class=\"pricing_features\">\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#c9a227\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#c9a227\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Everything in the Player tier\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#c9a227\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#c9a227\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Create and manage private game rooms\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#c9a227\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#c9a227\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Generate and manage invite links\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#c9a227\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#c9a227\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Choose room visual theme (4 options)\n                    <\/li>\n                    <li>\n                        <span class=\"check\">\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n                                <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"#c9a227\" stroke-width=\"1.2\"><\/circle>\n                                <path d=\"M5 8l2 2 4-4\" stroke=\"#c9a227\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n                            <\/svg>\n                        <\/span>\n                        Full whiteboard admin controls\n                    <\/li>\n                <\/ul>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"hd_field_item hidden\">\n        <label for=\"hd_invite_token\">Invite token<\/label>\n        <input type=\"text\" id=\"hd_invite_token\" name=\"hd_invite_token\" placeholder=\"@\" value=\"\" disabled>\n    <\/div>\n    <div id=\"hd_registration_logs\"><\/div>\n    <div id = \"hd_final\">\n            <div class=\"hd_input_item hd_field_item\" style = \"text-align:right\"><label class=\"hd_input_label\" for=\"hd_agree_TOS\">Agree to the <a href=\"https:\/\/talltale.games\/terms\" target=\"_blank\" class = \"button button_secondary\">Terms of Service<\/a><\/label>\n                <div data-type=\"radio\" data-required=\"\" class=\"hderp hd_input_radio\" id=\"hd_agree_TOS\">\n                    <div class=\"hd_input_row\">\n                        <label class=\"hd_label_input\" data-type=\"radio\" data-id=\"hd_agree_TOS\" for=\"hd_agree_TOS0\" style = \"margin-top: 1em\">\n                            <div class=\"hd_options_check\">\n                                <input type=\"checkbox\" title=\"Agree\" data-id=\"hd_agree_TOS\" class=\"hd_option hd_radio_input\" data-type=\"radio\" value=\"yes\" name=\"hd_agree_TOS0\" autocomplete=\"off\" id=\"hd_agree_TOS0\">\n                                <span class=\"hd_toggle\"><span class=\"hd_aria_label\">Enabled<\/span><\/span>\n                            <\/div>\n                            I Agree\n                        <\/label>\n                    <\/div>\n                <\/div>\n            <\/div>\n            <div class=\"alignright\">\n                <div id=\"hd_register_submit\" class=\"btn btn_gold\">Register<\/div>\n            <\/div>\n    <\/div>\n<\/div>\n<script>\n    async function hd_registration_form() {\n        let params = new URLSearchParams(document.location.search);\n        let role = params.get(\"role\"); \/\/ is the string \"Jonathan\"\n        if (role && role === \"gm\") {\n            document.getElementById(\"hd_registration_type_player\").classList.remove(\"active\");\n            document.getElementById(\"hd_registration_type_gm\").classList.add(\"active\");\n            document.getElementById(\"hd_registration_type\").setAttribute(\"data-value\", \"gm\");\n        }\n\n        const nonce = await fetch(HD_AJAX_URL, {\n            method: \"POST\",\n            credentials: \"same-origin\",\n            body: new URLSearchParams({\n                action: \"ttgp_get_registration_nonce\",\n            }),\n        });\n        const res = await nonce.json();\n        if (!res.success) {\n            console.error(\"issue getting registration nonce\")\n            return;\n        }\n\n        const toggles = document.getElementsByClassName(\"hd_registration_toggle_item\");\n        for (let i = 0; i < toggles.length; i++) {\n            toggles[i].addEventListener(\"click\", function() {\n                document.querySelector(\".hd_registration_toggle_item.active\").classList.remove(\"active\");\n                this.classList.add(\"active\");\n                let value = this.getAttribute(\"data-id\");\n                document.getElementById(\"hd_registration_type\").setAttribute(\"data-value\", value);\n            })\n        }\n\n        document.getElementById(\"hd_register_submit\").addEventListener(\"click\", async function() {\n            if (this.classList.contains(\"disabled\")) {\n                return;\n            }\n            this.classList.add(\"disabled\");\n\t\t\t\n            const emailEL = document.getElementById(\"hd_registration_email\");\n            const tokenEL = document.getElementById(\"hd_invite_token\");\n            const typeEL = document.getElementById(\"hd_registration_type\");\n\t\t\tconst agreeEL = document.getElementById(\"hd_agree_TOS0\");\n\t\t\t\n\t\t\t\n            let emailVal = emailEL.value.toLowerCase();\n            let tokenVal = tokenEL.value;\n            let typeVal = typeEL.getAttribute(\"data-value\");\n\t\t\tlet agreeVal = agreeEL.checked;\n\n            let re = \/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$\/;\n            if (!re.test(String(emailVal))) {\n                emailEL.classList.add(\"input_error\");\n\t\t\t\tthis.classList.remove(\"disabled\");\n                return;\n            } else {\n                emailEL.classList.remove(\"input_error\");\n            }\n\t\t\t\n\t\t\tif(!agreeVal){\n\t\t\t\tconsole.log(agreeEL.parentElement.parentElement)\n\t\t\t\tagreeEL.parentElement.parentElement.classList.add(\"input_error\");\n\t\t\t\tthis.classList.remove(\"disabled\");\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tagreeEL.parentElement.parentElement.classList.remove(\"input_error\");\n\t\t\t}\n\t\t\t\n            if (res.success && res.data.nonce) {\t\t\t\t\n\t\t\t\tif(typeVal === \"gm\"){\t\t\t\t\t\n\t\t\t\t\t\/\/ add product to cart first\n\t\t\t\t\tconst formdata = new FormData();\n\t\t\t\t\tformdata.append(\"action\", \"hdc_add_to_cart\");\n\t\t\t\t\tformdata.append(\"data\", '{\"product_id\":293,\"id\":\"\",\"quantity\":1,\"meta\":{}}');\n\t\t\t\t\tlet res = await fetch(HD_AJAX_URL, {\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tcredentials: \"same-origin\",\n\t\t\t\t\t\tbody: formdata,\n\t\t\t\t\t});\n\n\t\t\t\t\tres = await res.json();\n\t\t\t\t\tif (res.status !== \"success\") {\n\t\t\t\t\t\tdocument.getElementById(\"hd_registration_logs\").textContent = \"There was an issue with your registration. Please try again later or contact us for support.\";\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} \t\t\t\t\t\n\t\t\t\t}\t\t\t\t\n\t\t\t\t\n                const reg = await fetch(HD_AJAX_URL, {\n                    method: \"POST\",\n                    credentials: \"same-origin\",\n                    body: new URLSearchParams({\n                        action: \"ttgp_register_new_user\",\n                        email: emailVal,\n                        token: tokenVal,\n                        type: typeVal,\n\t\t\t\t\t\tTOS: agreeVal,\n                        nonce: res.data.nonce\n                    }),\n                });\n\t\t\t\t\n                const r = await reg.json();\n                if (r.data) {\n                    const logs = document.getElementById(\"hd_registration_logs\");\n                    logs.textContent = r.data.message;\n                    logs.classList.add(\"active\");\n\t\t\t\t\t\n\t\t\t\t\tif(r.data.message === \"Account created. Check your email to activate.\"){\n\t\t\t\t\t\tdocument.getElementById(\"hd_final\").remove();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(r.data.message === \"Account created. Redirecting to payment page.\"){\n\t\t\t\t\t\tdocument.getElementById(\"hd_final\").remove();\n\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\twindow.location.href = \"https:\/\/talltale.games\/cart\/?email=\" + emailVal;\n\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t}\t\t\t\t\t\n                }\n            }\n            this.classList.remove(\"disabled\");\n        })\n    }\n    hd_registration_form();\n<\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/pages\/10","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/comments?post=10"}],"version-history":[{"count":2,"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/pages\/10\/revisions"}],"predecessor-version":[{"id":14,"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/pages\/10\/revisions\/14"}],"wp:attachment":[{"href":"https:\/\/talltale.games\/hdapi\/wp\/v2\/media?parent=10"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}