Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add island level rewards via the Level addon - #411

Merged
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward
Jul 10, 2026
Merged

Add island level rewards via the Level addon#411
tastybento merged 3 commits into
developfrom
feat/279-island-level-reward

Conversation

@tastybento

Copy link
Copy Markdown
Member

Fixes#279

What

Challenges can now grant island levels as rewards, using the existing guarded Level addon hook:

  • Challenge.rewardIslandLevel (first completion) and Challenge.repeatIslandLevel (repeats, multiplied by the completion factor like money/XP)
  • ChallengeLevel.rewardIslandLevel (granted on level completion)
  • All default 0; applied additively via Level#getIslandLevel/setIslandLevel only when isLevelProvided() and the value is non-zero — no Level addon, no effect.

GUI

Number inputs added to the challenge reward editor (first-time and repeat) and the level reward editor, following the existing money/XP field patterns, with en-US locale strings.

Tests

Five new TryToCompleteTest cases: first-time reward applied, repeat reward with factor, no-op without the Level addon, no-op at 0, and level-completion reward. Rebased onto the just-merged #408 refactor (tryCompleteLevel) and adapted. Full suite: 471 tests, 0 failures.

In-game verification

  1. With Level installed, set a challenge's island level reward to 5; complete it → /island level +5.
  2. Repeat a repeatable challenge with a repeat island level reward → increases per repeat.
  3. Complete a level with an island level reward → applied once.
  4. Without Level installed, everything behaves as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v

tastybentoand others added 3 commits July 10, 2026 15:10
Challenges and challenge levels can now grant island levels on
completion (rewardIslandLevel / repeatIslandLevel, default 0). Applied
only when the Level addon is present. Repeat rewards multiply by the
completion factor, consistent with money and XP.
Fixes#279
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Extract the three identical island-level reward blocks into a single
rewardIslandLevel() helper. This also fixes the reward being applied
once per team member: the island is shared, so it is now applied once
per completion, outside the recipient loops.
Exclude the Gson data objects from copy-paste detection: their
accessors are intentionally identical bean boilerplate across
Challenge, ChallengeLevel and ChallengesPlayerData.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Combine the island-level reward tests with the #320 potion tests and
#111 consumption tests in TryToCompleteTest.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
@tastybento
tastybento merged commit eb8d91a into developJul 10, 2026
1 check passed
@sonarqubecloud

Copy link
Copy Markdown

tastybento added a commit that referenced this pull request Jul 10, 2026
Resolve overlaps with the island level reward feature (#411): both
GUI buttons kept (reward chance at slot 37, island level at 38), both
copy() lines and helper methods kept, and all test groups combined.
The reward chance gates item/money/XP rewards; island level rewards,
like commands, are not gated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NKxodNE4h3TsSHMqDEeC8v
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Increase Island Level by completing a challenge

1 participant

@tastybento