diff -ru a/appengine/bird.html b/appengine/bird.html --- a/appengine/bird.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/bird.html 2026-11-04 13:00:51.364242288 -0300 @@ -5,12 +5,12 @@ - Blockly Games : Bird + Block Coding Games : Bird - + diff -ru a/appengine/common/boot.js b/appengine/common/boot.js --- a/appengine/common/boot.js 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/common/boot.js 2026-11-04 13:00:51.365418834 -0300 @@ -10,46 +10,25 @@ */ 'use strict'; -// Redirect to new domain. -if (location.host === 'blockly-games.appspot.com') { - location.replace('https://blockly.games' + - location.pathname + location.search + location.hash); -} - (function() { // Application path. var appName = location.pathname.match(/\/([-\w]+)(\.html)?$/); appName = appName ? appName[1].replace('-', '/') : 'index'; // Supported languages (consistent across all apps). - window['BlocklyGamesLanguages'] = [ - 'am', 'ar', 'be', 'be-tarask', 'bg', 'bn', 'br', 'ca', 'cs', 'da', 'de', - 'el', 'en', 'eo', 'es', 'eu', 'fa', 'fi', 'fo', 'fr', 'gl', 'ha', 'he', - 'hi', 'hr', 'hu', 'hy', 'ia', 'id', 'ig', 'is', 'it', 'ja', 'kab', 'kn', - 'ko', 'lt', 'lv', 'ms', 'my', 'nb', 'nl', 'pl', 'pms', 'pt', 'pt-br', - 'ro', 'ru', 'sc', 'sk', 'sl', 'sq', 'sr', 'sr-latn', 'sv', 'th', 'ti', - 'tr', 'uk', 'ur', 'vi', 'yo', 'zh-hans', 'zh-hant' - ]; + // FredyGames: only the languages shipped with this build. + window['BlocklyGamesLanguages'] = ['en', 'pt-br']; // Use a series of heuristics that determine the likely language of this user. // First choice: The URL specified language. var param = location.search.match(/[?&]lang=([^&]+)/); var lang = param ? param[1].replace(/\+/g, '%20') : null; - if (window['BlocklyGamesLanguages'].indexOf(lang) !== -1) { - // Save this explicit choice as cookie. - var exp = (new Date(Date.now() + 2 * 31536000000)).toUTCString(); - document.cookie = 'lang=' + escape(lang) + '; expires=' + exp + 'path=/'; - } else { - // Second choice: Language cookie. - var cookie = document.cookie.match(/(^|;)\s*lang=([\w\-]+)/); - lang = cookie ? unescape(cookie[2]) : null; + if (window['BlocklyGamesLanguages'].indexOf(lang) === -1) { + // FredyGames: no language cookie (the page is hosted on a shared origin); + // fall back to the browser's language, then to English. + lang = navigator.language && navigator.language.toLowerCase(); if (window['BlocklyGamesLanguages'].indexOf(lang) === -1) { - // Third choice: The browser's language. - lang = navigator.language; - if (window['BlocklyGamesLanguages'].indexOf(lang) === -1) { - // Fourth choice: English. - lang = 'en'; - } + lang = 'en'; } } window['BlocklyGamesLang'] = lang; diff -ru a/appengine/index/src/html.js b/appengine/index/src/html.js --- a/appengine/index/src/html.js 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/index/src/html.js 2026-11-04 13:00:51.365550747 -0300 @@ -23,10 +23,8 @@ Index.html.start = function(ij) { return ` - - Blockly Games + + Block Coding Games - + diff -ru a/appengine/maze/src/main.js b/appengine/maze/src/main.js --- a/appengine/maze/src/main.js 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/maze/src/main.js 2026-11-04 13:00:51.365935568 -0300 @@ -49,19 +49,12 @@ // crashSound: List of sounds (in various formats) for player crashes. // crashType: Behaviour when player crashes (stop, spin, or fall). { - sprite: 'maze/pegman.png', - tiles: 'maze/tiles_pegman.png', - background: false, - look: '#000', - winSound: ['maze/win.mp3', 'maze/win.ogg'], - crashSound: ['maze/fail_pegman.mp3', 'maze/fail_pegman.ogg'], - crashType: CRASH_STOP, - }, - { sprite: 'maze/astro.png', tiles: 'maze/tiles_astro.png', - background: 'maze/bg_astro.jpg', - // Coma star cluster, photo by George Hatfield, used with permission. + // FredyGames: the background photo (used with permission by the original + // site only) is replaced by a plain colour. + background: false, + fill: '#17142e', look: '#fff', winSound: ['maze/win.mp3', 'maze/win.ogg'], crashSound: ['maze/fail_astro.mp3', 'maze/fail_astro.ogg'], @@ -70,8 +63,10 @@ { sprite: 'maze/panda.png', tiles: 'maze/tiles_panda.png', - background: 'maze/bg_panda.jpg', - // Spring canopy, photo by Rupert Fleetingly, CC licensed for reuse. + // FredyGames: the background photo (a third-party photo, "CC licensed for + // reuse") is replaced by a plain colour. + background: false, + fill: '#9cc27a', look: '#000', winSound: ['maze/win.mp3', 'maze/win.ogg'], crashSound: ['maze/fail_panda.mp3', 'maze/fail_panda.ogg'], @@ -304,7 +299,7 @@ Blockly.utils.dom.createSvgElement('rect', { 'height': MAZE_HEIGHT, 'width': MAZE_WIDTH, - 'fill': '#F1EEE7', + 'fill': SKIN.fill || '#F1EEE7', 'stroke-width': 1, 'stroke': '#CCB', }, svg); diff -ru a/appengine/maze.html b/appengine/maze.html --- a/appengine/maze.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/maze.html 2026-11-04 13:00:51.363359024 -0300 @@ -5,12 +5,12 @@ - Blockly Games : Maze + Block Coding Games : Maze - + diff -ru a/appengine/movie.html b/appengine/movie.html --- a/appengine/movie.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/movie.html 2026-11-04 13:00:51.364774563 -0300 @@ -5,12 +5,12 @@ - Blockly Games : Movie + Block Coding Games : Movie - + diff -ru a/appengine/music.html b/appengine/music.html --- a/appengine/music.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/music.html 2026-11-04 13:00:51.364890268 -0300 @@ -5,12 +5,12 @@ - Blockly Games : Music + Block Coding Games : Music - + diff -ru a/appengine/pond-duck.html b/appengine/pond-duck.html --- a/appengine/pond-duck.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/pond-duck.html 2026-11-04 13:00:51.364663066 -0300 @@ -5,7 +5,7 @@ - Blockly Games : Pond + Block Coding Games : Pond @@ -14,6 +14,6 @@ - + diff -ru a/appengine/pond-tutor.html b/appengine/pond-tutor.html --- a/appengine/pond-tutor.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/pond-tutor.html 2026-11-04 13:00:51.364527321 -0300 @@ -5,7 +5,7 @@ - Blockly Games : Pond Tutor + Block Coding Games : Pond Tutor @@ -14,6 +14,6 @@ - + diff -ru a/appengine/puzzle.html b/appengine/puzzle.html --- a/appengine/puzzle.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/puzzle.html 2026-11-04 13:00:51.364395033 -0300 @@ -5,12 +5,12 @@ - Blockly Games : Puzzle + Block Coding Games : Puzzle - + diff -ru a/appengine/src/lib-games.js b/appengine/src/lib-games.js --- a/appengine/src/lib-games.js 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/src/lib-games.js 2026-11-04 13:04:45.442610269 -0300 @@ -287,10 +287,7 @@ 'width=725, initial-scale=.35, user-scalable=no'); } - // Lazy-load Google Analytics. - if (!BlocklyGames.IS_HTML) { - setTimeout(BlocklyGames.importAnalytics3_, 1); - } + // FredyGames: no Google Analytics. }; /** diff -ru a/appengine/src/lib-interface.js b/appengine/src/lib-interface.js --- a/appengine/src/lib-interface.js 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/src/lib-interface.js 2026-11-04 13:06:18.472646447 -0300 @@ -186,6 +186,13 @@ options['toolbox'] = toolbox; } options['media'] = 'third-party/blockly/media/'; + // FredyGames: no "Help" item in the block menu, since it opens Wikipedia and + // other sites in a new tab. + try { + Blockly.ContextMenuRegistry.registry.unregister('blockHelp'); + } catch (e) { + // Already removed. + } options['oneBasedIndex'] = false; BlocklyInterface.workspace = Blockly.inject('blockly', options); BlocklyInterface.workspace.addChangeListener(BlocklyInterface.codeChanged); diff -ru a/appengine/turtle.html b/appengine/turtle.html --- a/appengine/turtle.html 2024-05-13 09:01:11.000000000 -0300 +++ b/appengine/turtle.html 2026-11-04 13:00:51.363882882 -0300 @@ -5,12 +5,12 @@ - Blockly Games : Turtle + Block Coding Games : Turtle - + diff -ru a/build/compress.py b/build/compress.py --- a/build/compress.py 2024-05-13 09:01:11.000000000 -0300 +++ b/build/compress.py 2026-11-04 13:02:28.555619001 -0300 @@ -46,7 +46,7 @@ print('Compressing %s' % gameName.title()) if not os.path.exists('appengine/%s/generated' % gameName): os.mkdir('appengine/%s/generated' % gameName) - generate_uncompressed(gameName) + # FredyGames: uncompressed.js (debug loader, needs Python 2's closurebuilder) is not generated. generate_compressed(gameName) filterMessages(gameName) @@ -191,8 +191,9 @@ def generate_compressed(gameName): cmd = [ - 'java', - '-jar', 'build/third-party-downloads/closure-compiler.jar', + # FredyGames: the native Closure Compiler binary (path in CLOSURE_COMPILER) + # instead of "java -jar closure-compiler.jar" (same compiler release). + os.environ['CLOSURE_COMPILER'], '--generate_exports', '--compilation_level', 'ADVANCED_OPTIMIZATIONS', '--dependency_mode=PRUNE', diff -ru a/json/pt-br.json b/json/pt-br.json --- a/json/pt-br.json 2024-05-13 09:01:11.000000000 -0300 +++ b/json/pt-br.json 2026-11-04 13:09:18.181534591 -0300 @@ -24,7 +24,7 @@ "Timarcosdias" ] }, - "Games.name": "Jogos do Blockly", + "Games.name": "Jogos de Programação em Blocos", "Games.puzzle": "Quebra-Cabeça", "Games.maze": "Labirinto", "Games.bird": "Pássaro", diff -ru a/messages.json b/messages.json --- a/messages.json 2024-05-13 09:01:11.000000000 -0300 +++ b/messages.json 2026-11-04 13:00:51.365221757 -0300 @@ -1,7 +1,7 @@ { "Games.name": { "desc": "The project name.", - "msg": "Blockly Games" + "msg": "Block Coding Games" }, "Games.puzzle": { "desc": "title - Specifies that this is Blockly's '''Puzzle''' game. Use the word for a jigsaw puzzle.\n{{Identical|Puzzle}}",