From c1de364a409c2298bb10b4b637c18fb0e911e82b Mon Sep 17 00:00:00 2001 From: WlodekM <75479945+WlodekM@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:45:06 +0200 Subject: [PATCH 1/3] dont use jwklong.github.io --- README.md | 2 +- src/components/prompt/prompt.jsx | 2 +- src/components/tw-description/description.jsx | 2 +- src/components/tw-studioview/studioview.js | 2 +- src/playground/credits/users.js | 2 +- src/playground/render-interface.jsx | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 450eea6533d..0e4b06bf420 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -scratch-gui modified for use in [TurboWarp](https://turbowarp.org/) then modified for use in [PenguinMod](https://jwklong.github.io/penguinmod.github.io) 😀 +scratch-gui modified for use in [TurboWarp](https://turbowarp.org/) then modified for use in [PenguinMod](https://penguinmod.com) 😀 [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/PenguinMod/penguinmod.github.io/) ## Setup diff --git a/src/components/prompt/prompt.jsx b/src/components/prompt/prompt.jsx index 3e4843128be..de3202bca5d 100644 --- a/src/components/prompt/prompt.jsx +++ b/src/components/prompt/prompt.jsx @@ -147,7 +147,7 @@ const PromptComponent = props => ( values={{ packager: ( diff --git a/src/components/tw-description/description.jsx b/src/components/tw-description/description.jsx index 7749e2c2fb1..2fbc6bb288b 100644 --- a/src/components/tw-description/description.jsx +++ b/src/components/tw-description/description.jsx @@ -228,7 +228,7 @@ class Renderer { if (/^\d{6,}$/.test(id)) { return ( {`#${id}`} diff --git a/src/components/tw-studioview/studioview.js b/src/components/tw-studioview/studioview.js index 1250adcbe16..9bfd6a69550 100644 --- a/src/components/tw-studioview/studioview.js +++ b/src/components/tw-studioview/studioview.js @@ -307,7 +307,7 @@ StudioView.THUMBNAIL_SRC = 'https://projects.penguinmod.com/api/v1/projects/getp // The URL for project pages. // $id is replaced with the project ID. -StudioView.PROJECT_PAGE = 'https://jwklong.github.io/penguinmod.github.io/#$id'; +StudioView.PROJECT_PAGE = 'https://penguinmod.com/#$id'; // The amount of "placeholders" to insert before the next page loads. StudioView.PLACEHOLDER_COUNT = 9; diff --git a/src/playground/credits/users.js b/src/playground/credits/users.js index 33cb76dd592..fd92d8ad410 100644 --- a/src/playground/credits/users.js +++ b/src/playground/credits/users.js @@ -21,7 +21,7 @@ const fromHardcodedGithub = username => ({ }); const fromHardcodedNamed = username => ({ image: `https://penguinmod.com/unknown_user.png`, - href: "https://jwklong.github.io/penguinmod.github.io/credits.html#", + href: "https://penguinmod.com/credits.html#", text: username }); diff --git a/src/playground/render-interface.jsx b/src/playground/render-interface.jsx index 58eb081c6b8..814156b90d1 100644 --- a/src/playground/render-interface.jsx +++ b/src/playground/render-interface.jsx @@ -164,7 +164,7 @@ const Footer = () => (
- + {/* Do not translate */} {'PenguinMod Packager'} From 2c993d1ee1a775a5ab5bf1517e433f7e9a1f44b6 Mon Sep 17 00:00:00 2001 From: WlodekM <75479945+WlodekM@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:57:05 +0200 Subject: [PATCH 2/3] oopsie --- README.md | 2 +- src/components/prompt/prompt.jsx | 2 +- src/components/tw-description/description.jsx | 2 +- src/components/tw-studioview/studioview.js | 2 +- src/playground/credits/users.js | 2 +- src/playground/render-interface.jsx | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0e4b06bf420..490d9b066ac 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -scratch-gui modified for use in [TurboWarp](https://turbowarp.org/) then modified for use in [PenguinMod](https://penguinmod.com) 😀 +scratch-gui modified for use in [TurboWarp](https://turbowarp.org/) then modified for use in [PenguinMod](https://studio.penguinmod.com) 😀 [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/PenguinMod/penguinmod.github.io/) ## Setup diff --git a/src/components/prompt/prompt.jsx b/src/components/prompt/prompt.jsx index de3202bca5d..1d648448140 100644 --- a/src/components/prompt/prompt.jsx +++ b/src/components/prompt/prompt.jsx @@ -147,7 +147,7 @@ const PromptComponent = props => ( values={{ packager: ( diff --git a/src/components/tw-description/description.jsx b/src/components/tw-description/description.jsx index 2fbc6bb288b..f4f6f30cb4a 100644 --- a/src/components/tw-description/description.jsx +++ b/src/components/tw-description/description.jsx @@ -228,7 +228,7 @@ class Renderer { if (/^\d{6,}$/.test(id)) { return ( {`#${id}`} diff --git a/src/components/tw-studioview/studioview.js b/src/components/tw-studioview/studioview.js index 9bfd6a69550..0fd4d513f65 100644 --- a/src/components/tw-studioview/studioview.js +++ b/src/components/tw-studioview/studioview.js @@ -307,7 +307,7 @@ StudioView.THUMBNAIL_SRC = 'https://projects.penguinmod.com/api/v1/projects/getp // The URL for project pages. // $id is replaced with the project ID. -StudioView.PROJECT_PAGE = 'https://penguinmod.com/#$id'; +StudioView.PROJECT_PAGE = 'https://studio.penguinmod.com/#$id'; // The amount of "placeholders" to insert before the next page loads. StudioView.PLACEHOLDER_COUNT = 9; diff --git a/src/playground/credits/users.js b/src/playground/credits/users.js index fd92d8ad410..53095256bf9 100644 --- a/src/playground/credits/users.js +++ b/src/playground/credits/users.js @@ -21,7 +21,7 @@ const fromHardcodedGithub = username => ({ }); const fromHardcodedNamed = username => ({ image: `https://penguinmod.com/unknown_user.png`, - href: "https://penguinmod.com/credits.html#", + href: "https://studio.penguinmod.com/credits.html#", text: username }); diff --git a/src/playground/render-interface.jsx b/src/playground/render-interface.jsx index 814156b90d1..3a97045b6a6 100644 --- a/src/playground/render-interface.jsx +++ b/src/playground/render-interface.jsx @@ -164,7 +164,7 @@ const Footer = () => (
- + {/* Do not translate */} {'PenguinMod Packager'} From 5648ffa0e62d3a1ec56bf8317be9ad85c5772c06 Mon Sep 17 00:00:00 2001 From: JeremyGamer13 <69337718+JeremyGamer13@users.noreply.github.com> Date: Tue, 12 Nov 2024 21:37:11 -0700 Subject: [PATCH 3/3] undo all of those reverted changes from new server --- favicon.png | Bin 0 -> 8993 bytes package.json | 4 +- .../addons/editor-extra-keys/userscript.js | 8 +- src/addons/addons/gamepad/userscript.js | 2 +- .../custom-procedures/custom-procedures.jsx | 31 +- .../custom-procedures/icon--dropper.svg | 8 + .../custom-procedures/icon--plus.svg | 5 - src/components/library-item/library-item.css | 18 +- src/components/menu-bar/share-button.jsx | 2 +- .../custom-extension-modal.jsx | 19 +- .../restore-point-modal.css | 10 + .../restore-point-modal.jsx | 2 + .../tw-restore-point-modal/restore-point.jsx | 18 +- .../tw-settings-modal/settings-modal.jsx | 29 +- src/containers/custom-procedures.jsx | 7 + src/containers/extension-library.jsx | 12 +- src/containers/tw-custom-extension-modal.jsx | 22 +- src/containers/tw-restore-point-manager.jsx | 44 +- src/containers/tw-security-manager.jsx | 28 +- src/containers/tw-settings-modal.jsx | 29 +- src/lib/libraries/backdrops.json | 76 +- src/lib/libraries/costumes.json | 809 +++++++++++++++++- src/lib/libraries/extensions/index.jsx | 48 +- src/lib/libraries/sounds-lengths.json | 22 +- src/lib/libraries/sounds.json | 367 ++++++-- src/lib/make-toolbox-xml.js | 73 +- src/lib/opcode-labels.js | 209 ++++- src/lib/tw-project-meta-fetcher-hoc.jsx | 2 +- src/lib/tw-restore-point-api.js | 13 +- src/lib/tw-state-manager-hoc.jsx | 17 +- src/playground/credits/credits.jsx | 30 +- src/playground/credits/users.js | 262 +++++- src/playground/render-interface.jsx | 2 +- src/reducers/tw.js | 1 + static/favicon.png | Bin 0 -> 8993 bytes static/images/192.png | Bin 7703 -> 14175 bytes static/images/512.png | Bin 19732 -> 34250 bytes static/images/apple-touch-icon.png | Bin 7704 -> 14175 bytes 38 files changed, 1953 insertions(+), 276 deletions(-) create mode 100644 favicon.png create mode 100644 src/components/custom-procedures/icon--dropper.svg delete mode 100644 src/components/custom-procedures/icon--plus.svg create mode 100644 static/favicon.png diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..d361c2365daf97043aa0952b4ef3068a2d2a1742 GIT binary patch literal 8993 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 Hu0mjfpV0SZ literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 43ab6a460a0..c93bc85df65 100644 --- a/package.json +++ b/package.json @@ -63,9 +63,9 @@ "protobufjs": "^7.3.2", "query-string": "^5.1.1", "raw-loader": "^0.5.1", - "react": "^16.0.0", + "react": "^16.14.0", "react-contextmenu": "2.9.4", - "react-dom": "^16.0.0", + "react-dom": "^16.14.0", "react-draggable": "3.0.5", "react-ga": "2.5.3", "react-intl": "2.9.0", diff --git a/src/addons/addons/editor-extra-keys/userscript.js b/src/addons/addons/editor-extra-keys/userscript.js index 131a597b938..3e23de6f882 100644 --- a/src/addons/addons/editor-extra-keys/userscript.js +++ b/src/addons/addons/editor-extra-keys/userscript.js @@ -78,13 +78,13 @@ export default async function ({ addon, msg }) { return keys; } - for (const opcode of ["sensing_keyoptions", "event_whenkeypressed"]) { + for (const opcode of ["sensing_keyoptions", "event_whenkeypressed", "event_whenkeyhit"]) { const block = ScratchBlocks.Blocks[opcode]; const originalInit = block.init; block.init = function (...args) { const originalJsonInit = this.jsonInit; this.jsonInit = function (obj) { - appendKeys(obj.args0[0].options, opcode === "event_whenkeypressed"); + appendKeys(obj.args0[0].options, opcode === "event_whenkeypressed" || opcode === "event_whenkeyhit"); return originalJsonInit.call(this, obj); }; return originalInit.call(this, ...args); @@ -97,7 +97,7 @@ export default async function ({ addon, msg }) { if (workspace && flyout) { const allBlocks = [...workspace.getAllBlocks(), ...flyout.getWorkspace().getAllBlocks()]; for (const block of allBlocks) { - if (block.type !== "event_whenkeypressed" && block.type !== "sensing_keyoptions") { + if (block.type !== "event_whenkeypressed" && block.type !== "event_whenkeyhit" && block.type !== "sensing_keyoptions") { continue; } const input = block.inputList[0]; @@ -110,7 +110,7 @@ export default async function ({ addon, msg }) { } field.menuGenerator_ = appendKeys( defaultKeys ? [...defaultKeys] : field.menuGenerator_, - block.type === "event_whenkeypressed" + block.type === "event_whenkeypressed" || block.type === "event_whenkeyhit" ); } } diff --git a/src/addons/addons/gamepad/userscript.js b/src/addons/addons/gamepad/userscript.js index f52dfb78d67..a38f7eb12fc 100644 --- a/src/addons/addons/gamepad/userscript.js +++ b/src/addons/addons/gamepad/userscript.js @@ -35,7 +35,7 @@ export default async function ({ addon, console, msg }) { const result = new Set(); for (const blocks of allBlocks) { for (const block of Object.values(blocks._blocks)) { - if (block.opcode === "event_whenkeypressed" || block.opcode === "sensing_keyoptions") { + if (block.opcode === "event_whenkeypressed" || block.opcode === "event_whenkeyhit" || block.opcode === "sensing_keyoptions") { // For blocks like "key (my variable) pressed?", the sensing_keyoptions still exists but has a null parent. if (block.opcode === "sensing_keyoptions" && !block.parent) { continue; diff --git a/src/components/custom-procedures/custom-procedures.jsx b/src/components/custom-procedures/custom-procedures.jsx index f835ac8f514..6abe3826d91 100644 --- a/src/components/custom-procedures/custom-procedures.jsx +++ b/src/components/custom-procedures/custom-procedures.jsx @@ -4,7 +4,7 @@ import Modal from '../../containers/modal.jsx'; import Box from '../box/box.jsx'; import { defineMessages, injectIntl, intlShape, FormattedMessage } from 'react-intl'; -import plusIcon from './icon--plus.svg'; +import dropperIcon from './icon--dropper.svg'; import booleanInputIcon from './icon--boolean-input.svg'; import textInputIcon from './icon--text-input.svg'; @@ -153,7 +153,7 @@ const BlockColorSection = props => ( onChange={props.onBlockColorChange} />
@@ -224,6 +224,32 @@ const CustomProcedures = props => ( /> +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/src/components/custom-procedures/icon--plus.svg b/src/components/custom-procedures/icon--plus.svg deleted file mode 100644 index ba6ea152d88..00000000000 --- a/src/components/custom-procedures/icon--plus.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/components/library-item/library-item.css b/src/components/library-item/library-item.css index 9177d4c41df..606acd8dbf0 100644 --- a/src/components/library-item/library-item.css +++ b/src/components/library-item/library-item.css @@ -34,7 +34,12 @@ padding: 0.25rem; padding-bottom: 0; } -.library-item-new { +.library-item-sound.library-item-new { + /* + we have to use hue-rotate, + since the waveforms have their color baked in by design + & the play button styling would be annoying + */ filter: hue-rotate(60deg); } .library-item-new-badge { @@ -42,12 +47,15 @@ color: white; font-size: 10px; font-weight: bold; - background-color: $sound-primary; + background-color: #EB6566; padding: 1px 5px; position: absolute; left: -8px; top: -8px; } +.library-item-sound .library-item-new-badge { + background-color: $sound-primary; +} .library-item-extension { align-self: stretch; @@ -60,6 +68,12 @@ .library-item-sound:hover { border-color: $sound-primary; } +.library-item-new:hover { + border-color: #EB6566; +} +.library-item-new.library-item-sound:hover { + border-color: $sound-primary; +} .library-item-favorite { background: transparent; diff --git a/src/components/menu-bar/share-button.jsx b/src/components/menu-bar/share-button.jsx index 908ec9af460..626032a3650 100644 --- a/src/components/menu-bar/share-button.jsx +++ b/src/components/menu-bar/share-button.jsx @@ -61,7 +61,7 @@ class ShareButton extends React.Component { } async handleMessageEvent(e) { if (!e.origin.startsWith(`https://penguinmod.com`)) { - //return; // BTODO: uncomment this line for prod (also change the link) + return; } if (!e.data.p4) { diff --git a/src/components/tw-custom-extension-modal/custom-extension-modal.jsx b/src/components/tw-custom-extension-modal/custom-extension-modal.jsx index 3c8e872372a..8165794301a 100644 --- a/src/components/tw-custom-extension-modal/custom-extension-modal.jsx +++ b/src/components/tw-custom-extension-modal/custom-extension-modal.jsx @@ -181,17 +181,20 @@ const CustomExtensionModal = props => ( />

)} -

- -

)} + {props.type === 'url' && ( +

+ +

+ )} +
@@ -151,7 +164,8 @@ RestorePoint.propTypes = { thumbnailSize: PropTypes.number.isRequired, assets: PropTypes.shape({}).isRequired, // Record onClickDelete: PropTypes.func.isRequired, - onClickLoad: PropTypes.func.isRequired + onClickLoad: PropTypes.func.isRequired, + onClickExport: PropTypes.func.isRequired }; export default RestorePoint; diff --git a/src/components/tw-settings-modal/settings-modal.jsx b/src/components/tw-settings-modal/settings-modal.jsx index 0c7baf7eaf9..91b42136f17 100644 --- a/src/components/tw-settings-modal/settings-modal.jsx +++ b/src/components/tw-settings-modal/settings-modal.jsx @@ -294,6 +294,27 @@ const EnableDangerousOptimizations = props => ( /> ); +const DisableOffscreenRendering = props => ( + + } + help={ + + } + // slug="out-of-bounds-rendering" + /> +); + const WarpTimer = props => ( ( id="pm.settingsModal.optimizations" /> + { const randomChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; @@ -125,7 +125,7 @@ class CustomExtensionModal extends React.Component { this.handleClose(); try { const url = await this.getExtensionURL(); - if (this.state.type !== 'url' && this.state.unsandboxed) { + if (this.state.unsandboxed) { manuallyTrustExtension(url); } if (this.props.swapId) { @@ -136,7 +136,7 @@ class CustomExtensionModal extends React.Component { if (!loadedIds.includes(this.props.swapId)) { for (const ext of loadedIds) this.props.vm.extensionManager.removeExtension(ext); // eslint-disable-next-line no-alert - alert('The extension you used to for the edit had a different id to the one you where editing.'); + alert('The extension you used for the edit had a different ID than the one you were editing.'); } this.props.vm.runtime._removeExtensionPrimitive(this.props.swapId); loadedIds.forEach(extId => { @@ -152,12 +152,15 @@ class CustomExtensionModal extends React.Component { } catch (err) { failed = true; log.error(err); - // eslint-disable-next-line no-alert - alert(err); + + if (err) { + // eslint-disable-next-line no-alert + alert(err); + } } finally { if (failed && this.props.swapId) { // eslint-disable-next-line no-alert - alert('The extension you used to for the edit has failed to load.'); + alert('The extension you used for the edit has failed to load.'); this.props.vm.runtime._removeExtensionPrimitive(this.props.swapId); } if (failed) return; @@ -220,12 +223,15 @@ class CustomExtensionModal extends React.Component { } isUnsandboxed () { if (this.state.type === 'url') { - return isTrustedExtension(this.state.url); + if (isTrustedExtensionOrigin(this.state.url)) return true; } return this.state.unsandboxed; } canChangeUnsandboxed () { - return this.state.type !== 'url'; + if (this.state.type === "url" && isTrustedExtensionOrigin(this.state.url)) { + return false; + } + return true; } handleChangeUnsandboxed (e) { this.setState({ diff --git a/src/containers/tw-restore-point-manager.jsx b/src/containers/tw-restore-point-manager.jsx index fad69cabbb1..388e7c04be0 100644 --- a/src/containers/tw-restore-point-manager.jsx +++ b/src/containers/tw-restore-point-manager.jsx @@ -9,6 +9,7 @@ import {LoadingStates, getIsShowingProject, onLoadedProject, requestProjectUploa import {setFileHandle} from '../reducers/tw'; import TWRestorePointModal from '../components/tw-restore-point-modal/restore-point-modal.jsx'; import RestorePointAPI from '../lib/tw-restore-point-api'; +import downloadBlob from '../lib/download-blob'; import log from '../lib/log'; /* eslint-disable no-alert */ @@ -49,10 +50,12 @@ class TWRestorePointManager extends React.Component { 'handleClickDelete', 'handleClickDeleteAll', 'handleChangeInterval', - 'handleClickLoad' + 'handleClickLoad', + 'handleClickExport' ]); this.state = { loading: true, + exporting: false, totalSize: 0, restorePoints: [], error: null, @@ -161,6 +164,9 @@ class TWRestorePointManager extends React.Component { if (!this.canLoadProject()) { return; } + if (this.state.exporting) { + return; + } this.props.onCloseModal(); this.props.onStartLoadingRestorePoint(this.props.loadingState); @@ -181,6 +187,41 @@ class TWRestorePointManager extends React.Component { }); } + handleClickExport (id) { + if (!this.props.isShowingProject) { + // this might break the state machine if we dont do this? not sure so we won't risk it & just return + return; + } + if (this.state.exporting) { + return; + } + + this.setState({ + exporting: true + }); + + // specifically add true so dontLoadProject is true + RestorePointAPI.loadRestorePoint(this.props.vm, id, true) + .then((arrayBuffer) => { + this.setState({ + exporting: false + }); + + const blob = new Blob([arrayBuffer], { type: "application/x.scratch.sb3" }); + downloadBlob("restore-point.pmp", blob); + }) + .catch(error => { + log.error(error); + alert(this.props.intl.formatMessage(messages.loadError, { + error + })); + + this.setState({ + exporting: false + }); + }); + } + handleChangeInterval (e) { const interval = +e.target.value; RestorePointAPI.setInterval(interval); @@ -282,6 +323,7 @@ class TWRestorePointManager extends React.Component { onClickDelete={this.handleClickDelete} onClickDeleteAll={this.handleClickDeleteAll} onClickLoad={this.handleClickLoad} + onClickExport={this.handleClickExport} interval={this.state.interval} onChangeInterval={this.handleChangeInterval} isLoading={this.state.loading} diff --git a/src/containers/tw-security-manager.jsx b/src/containers/tw-security-manager.jsx index 3777d90baeb..df952561940 100644 --- a/src/containers/tw-security-manager.jsx +++ b/src/containers/tw-security-manager.jsx @@ -16,11 +16,11 @@ const manuallyTrustExtension = url => { }; /** - * Trusted extensions are loaded automatically and without a sandbox. + * Trusted URL origins are allowed to load extensions without a sandbox automatically. * @param {string} url URL as a string. * @returns {boolean} True if the extension can is trusted */ -const isTrustedExtension = url => ( +const isTrustedExtensionOrigin = url => ( // Always trust our official extension repostiory. url.startsWith('https://extensions.turbowarp.org/') || url.startsWith('https://extensions.penguinmod.com/') || @@ -34,11 +34,17 @@ const isTrustedExtension = url => ( url.startsWith('http://localhost:8000') || url.startsWith('http://localhost:6000') || // Launcher Home url.startsWith('http://localhost:6001') || // Launcher Extensions - url.startsWith('https://penguinmod.com/') || // Local Home or Extensions + url.startsWith('http://localhost:5173') || // Local Home or Extensions url.startsWith('http://localhost:5174') || // Local Home or Extensions - extensionsTrustedByUser.has(url) + false // ignore this, just makes copy & paste easier ); +/** + * Trusted extensions are loaded automatically and without a sandbox. + * @param {string} url URL as a string. + * @returns {boolean} True if the extension can is trusted + */ +const isTrustedExtension = url => (isTrustedExtensionOrigin(url) || extensionsTrustedByUser.has(url)); /** * Set of fetch resource origins that were manually trusted by the user. @@ -284,8 +290,10 @@ class TWSecurityManagerComponent extends React.Component { return true; } const { showModal } = await this.acquireModalLock(); - // for backwards compatibility, allow urls to be unsandboxed - // if (url.startsWith('data:')) { + + // we allow all urls to be unsandboxed. + // its very likely that people would load any file unsandboxed anyways, theres no safety in blocking it for urls only. + // when a file is unsandboxed it can request any website anyways, so its not like its preventing remote updates either. const allowed = await showModal(SecurityModals.LoadExtension, { url, unsandboxed: true, @@ -304,11 +312,6 @@ class TWSecurityManagerComponent extends React.Component { }; } return allowed; - // } - // return showModal(SecurityModals.LoadExtension, { - // url, - // unsandboxed: false - // }); } /** @@ -502,5 +505,6 @@ const ConnectedSecurityManagerComponent = connect( export { ConnectedSecurityManagerComponent as default, manuallyTrustExtension, - isTrustedExtension + isTrustedExtension, + isTrustedExtensionOrigin }; diff --git a/src/containers/tw-settings-modal.jsx b/src/containers/tw-settings-modal.jsx index 5200ea0c631..4c8c2f1ec3c 100644 --- a/src/containers/tw-settings-modal.jsx +++ b/src/containers/tw-settings-modal.jsx @@ -32,7 +32,8 @@ class UsernameModal extends React.Component { 'handleStagePresetUsed', 'handleDisableCompilerChange', 'handleStoreProjectOptions', - 'handleEnableDangerousOptimizationsChange' + 'handleEnableDangerousOptimizationsChange', + 'handleDisableOffscreenRenderingChange' ]); } handleFramerateChange (e) { @@ -69,11 +70,15 @@ class UsernameModal extends React.Component { }); } handleEnableDangerousOptimizationsChange (e) { - console.log(e.target.checked); this.props.vm.setRuntimeOptions({ dangerousOptimizations: e.target.checked }); } + handleDisableOffscreenRenderingChange (e) { + this.props.vm.setRuntimeOptions({ + disableOffscreenRendering: e.target.checked + }); + } handleWarpTimerChange (e) { this.props.vm.setCompilerOptions({ warpTimer: e.target.checked @@ -92,15 +97,15 @@ class UsernameModal extends React.Component { } handleStagePresetUsed (widescreen) { switch (widescreen) { - case 1: - this.props.vm.setStageSize(640, 360); - break; - case 2: - this.props.vm.setStageSize(360, 360); - break; - default: - this.props.vm.setStageSize(480, 360); - break; + case 1: + this.props.vm.setStageSize(640, 360); + break; + case 2: + this.props.vm.setStageSize(360, 360); + break; + default: + this.props.vm.setStageSize(480, 360); + break; } } handleStoreProjectOptions () { @@ -125,6 +130,7 @@ class UsernameModal extends React.Component { onRemoveFencingChange={this.handleRemoveFencingChange} onRemoveLimitsChange={this.handleRemoveLimitsChange} onEnableDangerousOptimizationsChange={this.handleEnableDangerousOptimizationsChange} + onDisableOffscreenRenderingChange={this.handleDisableOffscreenRenderingChange} onWarpTimerChange={this.handleWarpTimerChange} onStageWidthChange={this.handleStageWidthChange} onStageHeightChange={this.handleStageHeightChange} @@ -182,6 +188,7 @@ const mapStateToProps = state => ({ infiniteClones: state.scratchGui.tw.runtimeOptions.maxClones === Infinity, removeFencing: !state.scratchGui.tw.runtimeOptions.fencing, removeLimits: !state.scratchGui.tw.runtimeOptions.miscLimits, + disableOffscreenRendering: state.scratchGui.tw.runtimeOptions.disableOffscreenRendering, dangerousOptimizations: state.scratchGui.tw.runtimeOptions.dangerousOptimizations, warpTimer: state.scratchGui.tw.compilerOptions.warpTimer, customStageSize: state.scratchGui.customStageSize, diff --git a/src/lib/libraries/backdrops.json b/src/lib/libraries/backdrops.json index df4230c11f7..4c16773f681 100644 --- a/src/lib/libraries/backdrops.json +++ b/src/lib/libraries/backdrops.json @@ -100,6 +100,18 @@ "rotationCenterX": 480, "rotationCenterY": 360 }, + { + "name": "Beachy Sky", + "tags": [ + "outdoors" + ], + "bitmapResolution": 2, + "dataFormat": "png", + "rotationCenterX": 480, + "rotationCenterY": 360, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/backdrops/Beachy_sky.png" + }, { "name": "Bedroom 1", "tags": [ @@ -190,6 +202,20 @@ "rotationCenterX": 480, "rotationCenterY": 360 }, + { + "name": "Calm Afternoon", + "tags": [ + "outdoors", + "lights", + "purple" + ], + "bitmapResolution": 2, + "dataFormat": "png", + "rotationCenterX": 480, + "rotationCenterY": 360, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/backdrops/calm_afternoon.png" + }, { "name": "Calm Night", "tags": [ @@ -278,6 +304,19 @@ "rotationCenterX": 480, "rotationCenterY": 360 }, + { + "name": "Checkers", + "tags": [ + "patterns", + "grid" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/backdrops/Checkers.svg" + }, { "name": "Circles", "tags": [ @@ -337,9 +376,9 @@ "name": "Desert", "tags": [ "desert", - " landscape", - " outdoors", - " cacti" + "landscape", + "outdoors", + "cacti" ], "assetId": "d98a9526a34890cf4bad11b5409eae2a", "bitmapResolution": 2, @@ -348,6 +387,19 @@ "rotationCenterX": 480, "rotationCenterY": 360 }, + { + "name": "Ducks", + "tags": [ + "outdoors", + "nature" + ], + "bitmapResolution": 2, + "dataFormat": "png", + "rotationCenterX": 480, + "rotationCenterY": 360, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/backdrops/ducks.png" + }, { "name": "Farm", "tags": [ @@ -421,8 +473,8 @@ "name": "Garden-rock", "tags": [ "outdoors", - " garden", - " park" + "garden", + "park" ], "assetId": "4f66053598bea0905e1559ab9d5a6e31", "bitmapResolution": 2, @@ -746,6 +798,20 @@ "rotationCenterX": 240, "rotationCenterY": 180 }, + { + "name": "River Landscape", + "tags": [ + "outdoors", + "river", + "landscape" + ], + "bitmapResolution": 2, + "dataFormat": "png", + "rotationCenterX": 480, + "rotationCenterY": 360, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/backdrops/river_landscape.png" + }, { "name": "Room 1", "tags": [ diff --git a/src/lib/libraries/costumes.json b/src/lib/libraries/costumes.json index 8af1c4a54dd..23128e476af 100644 --- a/src/lib/libraries/costumes.json +++ b/src/lib/libraries/costumes.json @@ -80,6 +80,18 @@ "rotationCenterX": 32, "rotationCenterY": 101 }, + { + "name": "Ahmet", + "tags": [ + "character" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/Ahmet.svg" + }, { "name": "Amon", "tags": [ @@ -681,6 +693,36 @@ "rotationCenterX": 39, "rotationCenterY": 38 }, + { + "name": "Base-a", + "tags": [ + "character", + "template", + "person", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/Base-a.svg" + }, + { + "name": "Base-b", + "tags": [ + "character", + "template", + "person", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/Base-b.svg" + }, { "name": "Baseball", "tags": [ @@ -838,6 +880,58 @@ "rotationCenterX": 70, "rotationCenterY": 102 }, + { + "name": "Battery-a", + "tags": [ + "electronic", + "power" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/battery-a.svg" + }, + { + "name": "Battery-b", + "tags": [ + "electronic", + "power" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/battery-b.svg" + }, + { + "name": "Battery-c", + "tags": [ + "electronic", + "power" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/battery-c.svg" + }, + { + "name": "Battery-d", + "tags": [ + "electronic", + "power" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/battery-d.svg" + }, { "name": "Beachball", "tags": [ @@ -1526,6 +1620,32 @@ "rotationCenterX": 72, "rotationCenterY": 72 }, + { + "name": "Button6-a", + "tags": [ + "icons", + "games" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/button2.svg" + }, + { + "name": "Button6-b", + "tags": [ + "icons", + "games" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/button.svg" + }, { "name": "Cake-a", "tags": [ @@ -1699,6 +1819,34 @@ "rotationCenterX": 94, "rotationCenterY": 180 }, + { + "name": "Cat1", + "tags": [ + "cat", + "animals", + "new" + ], + "bitmapResolution": 2, + "dataFormat": "png", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/cat.png" + }, + { + "name": "Cat2", + "tags": [ + "cat", + "animals", + "new" + ], + "bitmapResolution": 2, + "dataFormat": "png", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/cat_plain.png" + }, { "name": "Catcher-a", "tags": [ @@ -2409,6 +2557,36 @@ "fromPenguinModLibrary": true, "libraryFilePage": "images/redcheesepuffs.png" }, + { + "name": "Choci-a", + "tags": [ + "people", + "person", + "girl", + "character" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/choci-a.svg" + }, + { + "name": "Choci-b", + "tags": [ + "people", + "person", + "girl", + "character" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/choci-b.svg" + }, { "name": "Chick-a", "tags": [ @@ -2696,6 +2874,19 @@ "fromPenguinModLibrary": true, "libraryFilePage": "images/cubey-c.svg" }, + { + "name": "Cubey2", + "tags": [ + "drawing", + "character" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/cubey.svg" + }, { "name": "Cursor", "tags": [ @@ -2761,30 +2952,30 @@ "rotationCenterY": 44 }, { - "name": "Dango-b", + "name": "Dango Cat", "tags": [ "food", - "turbowarp" + "animals" ], + "assetId": "927d672925e7b99f7813735c484c6922", "bitmapResolution": 1, "dataFormat": "svg", + "md5ext": "927d672925e7b99f7813735c484c6922.svg", "rotationCenterX": 44, - "rotationCenterY": 44, - "fromPenguinModLibrary": true, - "libraryFilePage": "images/Dango-b.svg" + "rotationCenterY": 44 }, { - "name": "Dango Cat", + "name": "Dango Cat Ice Cream", "tags": [ "food", "animals" ], - "assetId": "927d672925e7b99f7813735c484c6922", "bitmapResolution": 1, "dataFormat": "svg", - "md5ext": "927d672925e7b99f7813735c484c6922.svg", - "rotationCenterX": 44, - "rotationCenterY": 44 + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ice_cream_dango.svg" }, { "name": "Dani-a", @@ -3906,8 +4097,8 @@ "name": "Drums Conga-a", "tags": [ "drums", - " music", - " ericr" + "music", + "ericr" ], "assetId": "2b2eacfce0fb1af023e6ca0f5ef6defe", "bitmapResolution": 1, @@ -3920,8 +4111,8 @@ "name": "Drums Conga-b", "tags": [ "drums", - " music", - " ericr" + "music", + "ericr" ], "assetId": "bdad2f140cfbd021f38241fc9acc7fd2", "bitmapResolution": 1, @@ -4190,6 +4381,111 @@ "rotationCenterX": 50, "rotationCenterY": 140 }, + { + "name": "Ewo-a", + "tags": [ + "turkey", + "bird", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ewo-a.svg" + }, + { + "name": "Ewo-b", + "tags": [ + "turkey", + "bird", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ewo-b.svg" + }, + { + "name": "Ewo-c", + "tags": [ + "turkey", + "bird", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ewo-c.svg" + }, + { + "name": "Ewo-d", + "tags": [ + "turkey", + "bird", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ewo-d.svg" + }, + { + "name": "Ewo-e", + "tags": [ + "turkey", + "bird", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ewo-e.svg" + }, + { + "name": "Ewo-f", + "tags": [ + "turkey", + "bird", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ewo-f.svg" + }, + { + "name": "Ewo-g", + "tags": [ + "turkey", + "bird", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/ewo-g.svg" + }, { "name": "Fairy-a", "tags": [ @@ -4433,6 +4729,22 @@ "rotationCenterX": 74, "rotationCenterY": 200 }, + { + "name": "Fork", + "tags": [ + "utensils", + "dinner", + "food", + "tool", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/utensils/Fork.svg" + }, { "name": "Fortune Cookie", "tags": [ @@ -4647,11 +4959,24 @@ "rotationCenterY": 22 }, { - "name": "Garbage Muffin", + "name": "Furbolt", "tags": [ - "garbo", - "food", - "turbowarp" + "animals", + "character" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/furbolt.svg" + }, + { + "name": "Garbage Muffin", + "tags": [ + "garbo", + "food", + "turbowarp" ], "bitmapResolution": 1, "dataFormat": "svg", @@ -6561,6 +6886,34 @@ "rotationCenterX": 62, "rotationCenterY": 94 }, + { + "name": "Kitty-a", + "tags": [ + "cat", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/kitty-a.svg" + }, + { + "name": "Kitty-b", + "tags": [ + "cat", + "animals", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/kitty-b.svg" + }, { "name": "Knight", "tags": [ @@ -6635,6 +6988,19 @@ "rotationCenterX": 75, "rotationCenterY": 75 }, + { + "name": "Laptop2", + "tags": [ + "things", + "computers" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/fantasia1.svg" + }, { "name": "Lb Pop Down", "tags": [ @@ -7142,6 +7508,19 @@ "rotationCenterX": 37, "rotationCenterY": 59 }, + { + "name": "Menu", + "tags": [ + "icons", + "games" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/menu.svg" + }, { "name": "Mermaid-a", "tags": [ @@ -8156,6 +8535,22 @@ "rotationCenterX": 48, "rotationCenterY": 61 }, + { + "name": "Penguin3-a", + "tags": [ + "animals", + "bird", + "winter", + "antarctica", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/penguin-styled.svg" + }, { "name": "Pick", "tags": [ @@ -8229,6 +8624,21 @@ "rotationCenterX": 84, "rotationCenterY": 57 }, + { + "name": "Plane", + "tags": [ + "airspace", + "aerospace", + "transportation", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/plane.svg" + }, { "name": "Planet2", "tags": [ @@ -8681,6 +9091,19 @@ "rotationCenterX": 72, "rotationCenterY": 36 }, + { + "name": "Redo", + "tags": [ + "icons", + "tool" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/redo.svg" + }, { "name": "Referee-a", "tags": [ @@ -9096,6 +9519,118 @@ "rotationCenterX": 76, "rotationCenterY": 142 }, + { + "name": "Rune-a", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-a.svg" + }, + { + "name": "Rune-a2", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-a2.svg" + }, + { + "name": "Rune-b", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-b.svg" + }, + { + "name": "Rune-b2", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-b2.svg" + }, + { + "name": "Rune-c", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-c.svg" + }, + { + "name": "Rune-c2", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-c2.svg" + }, + { + "name": "Rune-d", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-d.svg" + }, + { + "name": "Rune-d2", + "tags": [ + "fantasy", + "cuneiform", + "rune" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/rune/rune-d2.svg" + }, { "name": "Sailboat", "tags": [ @@ -9248,6 +9783,149 @@ "rotationCenterX": 30, "rotationCenterY": 44 }, + { + "name": "Segment-0", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/0.svg" + }, + { + "name": "Segment-1", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/1.svg" + }, + { + "name": "Segment-2", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/2.svg" + }, + { + "name": "Segment-3", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/3.svg" + }, + { + "name": "Segment-4", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/4.svg" + }, + { + "name": "Segment-5", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/5.svg" + }, + { + "name": "Segment-6", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/6.svg" + }, + { + "name": "Segment-7", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/7.svg" + }, + { + "name": "Segment-8", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/8.svg" + }, + { + "name": "Segment-9", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/9.svg" + }, + { + "name": "Segment-off", + "tags": [ + "numbers", + "digits" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/segment/off.svg" + }, { "name": "Shark-a", "tags": [ @@ -9647,6 +10325,48 @@ "rotationCenterX": 104, "rotationCenterY": 103 }, + { + "name": "Snowboy-a", + "tags": [ + "character", + "drawing", + "fantasy" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/Snowboy-a.svg" + }, + { + "name": "Snowboy-b", + "tags": [ + "character", + "drawing", + "fantasy" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/Snowboy-b.svg" + }, + { + "name": "Snowboy-c", + "tags": [ + "character", + "drawing", + "fantasy" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/Snowboy-c.svg" + }, { "name": "Snowman", "tags": [ @@ -9692,6 +10412,38 @@ "rotationCenterX": 53, "rotationCenterY": 79 }, + { + "name": "Spoon", + "tags": [ + "utensils", + "dinner", + "food", + "tool", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/utensils/Spoon.svg" + }, + { + "name": "Spoon and Fork", + "tags": [ + "utensils", + "dinner", + "food", + "tool", + "new" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/utensils/SpoonAndFork.svg" + }, { "name": "Squirrel", "tags": [ @@ -9880,8 +10632,8 @@ "name": "Tabla-a", "tags": [ "drums", - " music", - " ericr" + "music", + "ericr" ], "assetId": "af071d9d714c5c622e2bb07133698ce3", "bitmapResolution": 1, @@ -9894,8 +10646,8 @@ "name": "Tabla-b", "tags": [ "drums", - " music", - " ericr" + "music", + "ericr" ], "assetId": "992d6359be830d977559dad91b04f698", "bitmapResolution": 1, @@ -10629,6 +11381,19 @@ "fromPenguinModLibrary": true, "libraryFilePage": "images/turkeyplate.svg" }, + { + "name": "Undo", + "tags": [ + "icons", + "tool" + ], + "bitmapResolution": 1, + "dataFormat": "svg", + "rotationCenterX": 0, + "rotationCenterY": 0, + "fromPenguinModLibrary": true, + "libraryFilePage": "images/user/undo.svg" + }, { "name": "Unicorn", "tags": [ diff --git a/src/lib/libraries/extensions/index.jsx b/src/lib/libraries/extensions/index.jsx index da07ba7ef85..76e09e05dcf 100644 --- a/src/lib/libraries/extensions/index.jsx +++ b/src/lib/libraries/extensions/index.jsx @@ -329,6 +329,16 @@ const menuItems = [ description: 'Blocks for reading and creating files.', featured: true }, + { + name: 'Zip', + extensionId: 'https://extensions.turbowarp.org/CST1229/zip.js', + iconURL: 'https://extensions.turbowarp.org/images/CST1229/zip.svg', + insetIconURL: turbowarpIcon, + tags: ['turbowarp', 'datamgmt'], + description: 'Create and edit .zip format files, including .sb3 files.', + twDeveloper: 'CST1229', + featured: true + }, { name: 'Pen+', extensionId: 'https://extensions.penguinmod.com/extensions/ObviousAlexC/PenPlus.js', @@ -630,16 +640,6 @@ const menuItems = [ featured: true, extDeveloper: 'silvxrcat' }, - { - name: 'PenguinAI', - extensionId: 'https://extensions.penguinmod.com/extensions/MubiLop/penguingpt.js', - iconURL: 'https://extensions.penguinmod.com/images/MubiLop/penguingpt.png', - tags: ['penguinmod'], - description: 'Talk to AI! Use Models like DALL-E-3, GPT, LLama, Claude, and more! Please read PenguinMod\'s Privacy Policy before use.', - extDeveloper: 'MubiLop', - internetConnectionRequired: true, - featured: true - }, { name: 'HTML iframe Elements', extensionId: 'jgIframe', @@ -649,28 +649,6 @@ const menuItems = [ featured: true, internetConnectionRequired: true }, - { - name: ( - - ), - extensionId: 'newCanvas', - iconURL: canvasExtensionBanner, - tags: ['penguinmod'], - insetIconURL: canvasExtensionIcon, - customInsetColor: '#0094FF', - description: ( - - ), - featured: true - }, { name: 'Color Picker', extensionId: 'shovelColorPicker', @@ -749,7 +727,7 @@ const menuItems = [ }, { name: 'McUtils', - extensionId: 'https://extensions.turbowarp.org/Lily/McUtils.js', // update reference once file names are updated + extensionId: 'https://extensions.turbowarp.org/Lily/McUtils.js', tags: ['turbowarp', 'joke'], iconURL: 'https://extensions.turbowarp.org/images/Lily/McUtils.png', insetIconURL: turbowarpIcon, @@ -1271,7 +1249,7 @@ if (IsLocal || IsLiveTests) { }, { name: 'Test Extension Loader', - href: 'https://jwklong.github.io/penguinmod.github.io/loadExt.html', + href: 'https://studio.penguinmod.com/loadExt.html', extensionId: 'special_testExtensionLibrary', iconURL: defaultExtensionIcon, description: 'Test loading extensions from a library. For developers.', @@ -1279,7 +1257,7 @@ if (IsLocal || IsLiveTests) { }, { name: 'Editor', - href: 'https://jwklong.github.io/penguinmod.github.io/editor.html', + href: 'https://studio.penguinmod.com/editor.html', extensionId: 'special_editorExtensionLibrary', iconURL: penguinmodLibraryExtensionIcon, description: 'Opens the editor with this tab as the parent, still with the library opened. For developers.', diff --git a/src/lib/libraries/sounds-lengths.json b/src/lib/libraries/sounds-lengths.json index f6235fbdd16..7bd0be24172 100644 --- a/src/lib/libraries/sounds-lengths.json +++ b/src/lib/libraries/sounds-lengths.json @@ -4,6 +4,7 @@ "sounds/win3.mp3": 3420, "sounds/win2.mp3": 2270, "sounds/water_submerge.mp3": 2220, + "sounds/upbeat_n_uphill.mp3": 21410, "sounds/techno4.mp3": 16040, "sounds/techno3.mp3": 16030, "sounds/tear.mp3": 630, @@ -25,6 +26,7 @@ "sounds/sp_shiningaura.mp3": 96080, "sounds/sp_readytogo.mp3": 29570, "sounds/sp_overworld.mp3": 14810, + "sounds/sorrowful_piano.mp3": 88690, "sounds/smallburp.mp3": 180, "sounds/smallbreak3.mp3": 620, "sounds/smallbreak2.mp3": 600, @@ -41,6 +43,7 @@ "sounds/scream4.mp3": 1440, "sounds/scream3.mp3": 550, "sounds/scissors.mp3": 220, + "sounds/sad_serenade.mp3": 101170, "sounds/roger_that.mp3": 680, "sounds/relaxing_plaza.mp3": 118260, "sounds/radarping.mp3": 4020, @@ -131,6 +134,7 @@ "sounds/boing4.mp3": 970, "sounds/boing3.mp3": 1020, "sounds/boing2.mp3": 940, + "sounds/blink.mp3": 340, "sounds/bikehorn.mp3": 1070, "sounds/bellding.mp3": 3130, "sounds/basically_green.mp3": 15650, @@ -185,17 +189,31 @@ "sounds/drumbreak/cowbell1.mp3": 5690, "sounds/drumbreak/break2.mp3": 4570, "sounds/drumbreak/break1.mp3": 5620, + "sounds/user/loops/opl2shortthing.mp3": 51280, + "sounds/user/loops/LethalCastle.mp3": 16080, + "sounds/user/loops/DrumLoop2.mp3": 7160, + "sounds/user/loops/DrumLoop1.mp3": 7160, + "sounds/user/themes/OttawaFINAL.mp3": 62170, + "sounds/user/themes/battletheme1.mp3": 64080, + "sounds/user/effects/wind_blowing.mp3": 16030, + "sounds/user/effects/willhelm.mp3": 1440, + "sounds/user/effects/RetroJump.mp3": 480, + "sounds/user/effects/evil_villian_4.mp3": 1930, + "sounds/user/effects/evil_villian_3.mp3": 1250, + "sounds/user/effects/evil_villian_2.mp3": 2530, + "sounds/user/effects/evil_villian_1.mp3": 2430, + "sounds/user/effects/error.mp3": 1880, "sounds/monster/snarl/snarl04.mp3": 2660, "sounds/monster/snarl/snarl03.mp3": 3580, "sounds/monster/snarl/snarl02.mp3": 3000, "sounds/monster/snarl/snarl01.mp3": 3000, "sounds/material/metal/sheet/sheet01.mp3": 600, + "sounds/material/metal/pipe/pipe02.mp3": 1570, + "sounds/material/metal/pipe/pipe01.mp3": 1650, "sounds/material/metal/scrape/scrape04.mp3": 340, "sounds/material/metal/scrape/scrape03.mp3": 340, "sounds/material/metal/scrape/scrape02.mp3": 500, "sounds/material/metal/scrape/scrape01.mp3": 240, - "sounds/material/metal/pipe/pipe02.mp3": 1570, - "sounds/material/metal/pipe/pipe01.mp3": 1650, "sounds/material/metal/hit/hit05.mp3": 370, "sounds/material/metal/hit/hit04.mp3": 550, "sounds/material/metal/hit/hit03.mp3": 860, diff --git a/src/lib/libraries/sounds.json b/src/lib/libraries/sounds.json index ac2ade621da..dbd7d6309d4 100644 --- a/src/lib/libraries/sounds.json +++ b/src/lib/libraries/sounds.json @@ -68,6 +68,20 @@ "fromPenguinModLibrary": true, "libraryFilePage": "sounds/bossa-chords.mp3" }, + { + "name": "Ottawa", + "tags": [ + "music", + "themes", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/themes/OttawaFINAL.mp3" + }, { "name": "Overworld", "tags": [ @@ -330,6 +344,21 @@ "fromPenguinModLibrary": true, "libraryFilePage": "sounds/exhale.mp3" }, + { + "name": "Final Struggle", + "tags": [ + "music", + "loops", + "themes", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/themes/battletheme1.mp3" + }, { "name": "Fire in the Hole", "tags": [ @@ -515,8 +544,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -530,8 +558,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -545,8 +572,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -560,8 +586,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -575,8 +600,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -590,8 +614,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -605,8 +628,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -620,8 +642,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -635,8 +656,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -650,8 +670,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -665,8 +684,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -680,8 +698,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -695,8 +712,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -710,8 +726,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -725,8 +740,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -740,8 +754,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -755,8 +768,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -770,8 +782,7 @@ "effects", "material", "metal", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -1341,8 +1352,7 @@ "name": "Bell Ding", "tags": [ "effects", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -1464,8 +1474,7 @@ "effects", "cartoon", "wacky", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -1554,6 +1563,23 @@ "sampleCount": 137161, "rate": 22050 }, + { + "name": "Bouncing Around", + "tags": [ + "music", + "themes", + "loops", + "8-bit", + "8bit", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/loops/opl2shortthing.mp3" + }, { "name": "Bowling Strike", "tags": [ @@ -3138,6 +3164,36 @@ "sampleCount": 37593, "rate": 22050 }, + { + "name": "Drum Set3", + "tags": [ + "music", + "loops", + "percussion", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/loops/DrumLoop1.mp3" + }, + { + "name": "Drum Set4", + "tags": [ + "music", + "loops", + "percussion", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/loops/DrumLoop2.mp3" + }, { "name": "Dubstep", "tags": [ @@ -3425,6 +3481,20 @@ "fromPenguinModLibrary": true, "libraryFilePage": "sounds/error2.mp3" }, + { + "name": "Error3", + "tags": [ + "effects", + "ui", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/effects/error.mp3" + }, { "name": "Explosion1", "tags": [ @@ -4206,8 +4276,7 @@ "tags": [ "music", "loops", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -4660,8 +4729,7 @@ "tags": [ "effects", "cinematic", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -4674,8 +4742,7 @@ "tags": [ "effects", "cinematic", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -4688,8 +4755,7 @@ "tags": [ "effects", "cinematic", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -4702,8 +4768,7 @@ "tags": [ "effects", "cinematic", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -4716,8 +4781,7 @@ "tags": [ "effects", "cinematic", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -4808,6 +4872,23 @@ "fromPenguinModLibrary": true, "libraryFilePage": "sounds/hop.mp3" }, + { + "name": "Jump4", + "tags": [ + "effects", + "electronic", + "8-bit", + "8bit", + "games", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/effects/RetroJump.mp3" + }, { "name": "Jungle", "tags": [ @@ -5100,6 +5181,22 @@ "sampleCount": 128260, "rate": 44100 }, + { + "name": "Lethal Castle", + "tags": [ + "music", + "loops", + "8bit", + "8-bit", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/loops/LethalCastle.mp3" + }, { "name": "Lo Geh Tabla", "tags": [ @@ -5305,8 +5402,7 @@ "tags": [ "effects", "monster", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -5319,8 +5415,7 @@ "tags": [ "effects", "monster", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -5333,8 +5428,7 @@ "tags": [ "effects", "monster", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -5347,8 +5441,7 @@ "tags": [ "effects", "monster", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -5814,6 +5907,21 @@ "sampleCount": 68440, "rate": 44100 }, + { + "name": "Sad Serenade", + "tags": [ + "music", + "themes", + "cinematic", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/sad_serenade.mp3" + }, { "name": "Scrambling Feet", "tags": [ @@ -5924,8 +6032,7 @@ "voice", "human", "wacky", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -5939,6 +6046,19 @@ "voice", "human", "wacky", + "penguinmod" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/scream7.mp3" + }, + { + "name": "Scream8", + "tags": [ + "voice", + "human", "penguinmod", "new" ], @@ -5946,7 +6066,7 @@ "md5ext": "sound.mp3", "rate": 44100, "fromPenguinModLibrary": true, - "libraryFilePage": "sounds/scream7.mp3" + "libraryFilePage": "sounds/user/effects/willhelm.mp3" }, { "name": "Screech", @@ -6091,8 +6211,7 @@ "name": "Slam 2", "tags": [ "effects", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -6104,8 +6223,7 @@ "name": "Slam 3", "tags": [ "effects", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -6117,8 +6235,7 @@ "name": "Slam 4", "tags": [ "effects", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -6130,8 +6247,7 @@ "name": "Slam 5", "tags": [ "effects", - "penguinmod", - "new" + "penguinmod" ], "dataFormat": "mpeg", "md5ext": "sound.mp3", @@ -6277,6 +6393,22 @@ "sampleCount": 17273, "rate": 22050 }, + { + "name": "Sorrowful Piano", + "tags": [ + "music", + "themes", + "cinematic", + "sad", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/sorrowful_piano.mp3" + }, { "name": "Space Ambience", "tags": [ @@ -7031,6 +7163,20 @@ "sampleCount": 93696, "rate": 44100 }, + { + "name": "Upbeat n' Uphill", + "tags": [ + "music", + "loops", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/upbeat_n_uphill.mp3" + }, { "name": "Video Game 1", "tags": [ @@ -7060,6 +7206,70 @@ "sampleCount": 150369, "rate": 22050 }, + { + "name": "Villian 1", + "tags": [ + "effects", + "wacky", + "evil", + "voice", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/effects/evil_villian_1.mp3" + }, + { + "name": "Villian 2", + "tags": [ + "effects", + "wacky", + "evil", + "voice", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/effects/evil_villian_2.mp3" + }, + { + "name": "Villian 3", + "tags": [ + "effects", + "wacky", + "evil", + "voice", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/effects/evil_villian_3.mp3" + }, + { + "name": "Villian 4", + "tags": [ + "effects", + "wacky", + "evil", + "voice", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/effects/evil_villian_4.mp3" + }, { "name": "Wah Beatbox", "tags": [ @@ -7188,6 +7398,21 @@ "fromPenguinModLibrary": true, "libraryFilePage": "sounds/win3.mp3" }, + { + "name": "Wind Blowing", + "tags": [ + "effects", + "ambience", + "background", + "penguinmod", + "new" + ], + "dataFormat": "mpeg", + "md5ext": "sound.mp3", + "rate": 44100, + "fromPenguinModLibrary": true, + "libraryFilePage": "sounds/user/effects/wind_blowing.mp3" + }, { "name": "Wobble", "tags": [ diff --git a/src/lib/make-toolbox-xml.js b/src/lib/make-toolbox-xml.js index 6d7c8b47d2d..1f0f0ee9c26 100644 --- a/src/lib/make-toolbox-xml.js +++ b/src/lib/make-toolbox-xml.js @@ -30,13 +30,6 @@ const motion = function (isInitialSetup, isStage, targetId) { - - - - 10 - - - @@ -182,7 +175,6 @@ const motion = function (isInitialSetup, isStage, targetId) { ${blockSeparator} - ${blockSeparator} ${blockSeparator} @@ -277,8 +269,8 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - - + + ${blockSeparator} `} ${isStage ? ` @@ -297,7 +289,6 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - @@ -317,17 +308,6 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - - ${blockSeparator} - - - - ${backdropName} - - - - - @@ -339,6 +319,15 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop ${blockSeparator} + + + + ${backdropName} + + + + + ${blockSeparator} @@ -366,8 +355,8 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - - + + `} ${blockSeparator} @@ -390,13 +379,13 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - - + + ${blockSeparator} ${isStage ? '' : ` - + ${blockSeparator} @@ -434,7 +423,7 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - + ${blockSeparator} `} ${isStage ? ` @@ -521,7 +510,6 @@ const sound = function (isInitialSetup, isStage, targetId, soundName) { - ${blockSeparator} @@ -545,7 +533,7 @@ const sound = function (isInitialSetup, isStage, targetId, soundName) { - + ${blockSeparator} @@ -641,6 +629,7 @@ const control = function (isInitialSetup, isStage) { + ${blockSeparator} @@ -735,6 +724,7 @@ const control = function (isInitialSetup, isStage) { + `} ${LazyScratchBlocks.isNameUrMom() ? '' : ''} ${categorySeparator} @@ -742,7 +732,7 @@ const control = function (isInitialSetup, isStage) { `; }; -const sensing = function (isInitialSetup, isStage) { +const sensing = function (isInitialSetup, isStage, targetId) { const name = translate('SENSING_ASK_TEXT', 'What\'s your name?'); // const openDocumentation = translate('OPEN_DOCUMENTATION', 'Open Documentation'); const helpManual = translate('HELP_MANUAL', 'Help Manual'); @@ -762,6 +752,14 @@ const sensing = function (isInitialSetup, isStage) { + + + + + + + + @@ -889,7 +887,7 @@ const sensing = function (isInitialSetup, isStage) { ${isStage ? '' : ` ${blockSeparator} - + ${blockSeparator} `} ${blockSeparator} @@ -1433,6 +1431,17 @@ const liveTests = function () { + ${blockSeparator} + + + + + + + + + ${blockSeparator} + `; }; diff --git a/src/lib/opcode-labels.js b/src/lib/opcode-labels.js index 1c150293126..cf42552373e 100644 --- a/src/lib/opcode-labels.js +++ b/src/lib/opcode-labels.js @@ -43,7 +43,106 @@ const messages = defineMessages({ description: 'Label for the backdrop number monitor when shown on the stage', id: 'gui.opcodeLabels.backdropnumber' }, - + looks_stretchGetX: { + defaultMessage: 'stretch x', + description: 'Label for the stretch x monitor when shown on the stage', + id: 'gui.opcodeLabels.stretchGetX' + }, + looks_stretchGetY: { + defaultMessage: 'stretch y', + description: 'Label for the stretch y monitor when shown on the stage', + id: 'gui.opcodeLabels.stretchGetY' + }, + looks_sayWidth: { + defaultMessage: 'bubble width', + description: 'Label for the bubble width monitor when shown on the stage', + id: 'gui.opcodeLabels.sayWidth' + }, + looks_sayHeight: { + defaultMessage: 'bubble height', + description: 'Label for the bubble height monitor when shown on the stage', + id: 'gui.opcodeLabels.sayHeight' + }, + looks_getEffectValue: { + defaultMessage: 'effect', + description: 'Label for the effect monitor with no effect chosen when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue' + }, + looks_getEffectValue_color: { + defaultMessage: 'color effect', + description: 'Label for the color effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.color' + }, + looks_getEffectValue_fisheye: { + defaultMessage: 'fisheye effect', + description: 'Label for the fisheye effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.fisheye' + }, + looks_getEffectValue_whirl: { + defaultMessage: 'whirl effect', + description: 'Label for the whirl effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.whirl' + }, + looks_getEffectValue_pixelate: { + defaultMessage: 'pixelate effect', + description: 'Label for the pixelate effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.pixelate' + }, + looks_getEffectValue_mosaic: { + defaultMessage: 'mosaic effect', + description: 'Label for the mosaic effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.mosaic' + }, + looks_getEffectValue_brightness: { + defaultMessage: 'brightness effect', + description: 'Label for the brightness effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.brightness' + }, + looks_getEffectValue_ghost: { + defaultMessage: 'ghost effect', + description: 'Label for the ghost effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.ghost' + }, + looks_getEffectValue_saturation: { + defaultMessage: 'saturation effect', + description: 'Label for the saturation effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.saturation' + }, + looks_getEffectValue_red: { + defaultMessage: 'red effect', + description: 'Label for the red effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.red' + }, + looks_getEffectValue_green: { + defaultMessage: 'green effect', + description: 'Label for the green effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.green' + }, + looks_getEffectValue_blue: { + defaultMessage: 'blue effect', + description: 'Label for the blue effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.blue' + }, + looks_getEffectValue_opaque: { + defaultMessage: 'opaque effect', + description: 'Label for the opaque effect monitor when shown on the stage', + id: 'gui.opcodeLabels.getEffectValue.opaque' + }, + looks_tintColor: { + defaultMessage: 'tint color', + description: 'Label for the tint color monitor when shown on the stage', + id: 'gui.opcodeLabels.tintColor' + }, + looks_getSpriteVisible: { + defaultMessage: 'visible?', + description: 'Label for the visible monitor when shown on the stage', + id: 'gui.opcodeLabels.getSpriteVisible' + }, + looks_layersGetLayer: { + defaultMessage: 'layer', + description: 'Label for the layer monitor when shown on the stage', + id: 'gui.opcodeLabels.layersGetLayer' + }, // Sound sound_volume: { @@ -51,6 +150,21 @@ const messages = defineMessages({ description: 'Label for the volume monitor when shown on the stage', id: 'gui.opcodeLabels.volume' }, + sound_getEffectValue: { + defaultMessage: 'effect', + description: 'Label for the sound effect monitor with no effect chosen when shown on the stage', + id: 'gui.opcodeLabels.soundgetEffectValue' + }, + sound_getEffectValue_pitch: { + defaultMessage: 'pitch', + description: 'Label for the pitch effect monitor when shown on the stage', + id: 'gui.opcodeLabels.soundgetEffectValue.pitch' + }, + sound_getEffectValue_pan: { + defaultMessage: 'pan left/right', + description: 'Label for the pan left/right effect monitor when shown on the stage', + id: 'gui.opcodeLabels.soundgetEffectValue.pan' + }, sound_tempo: { defaultMessage: 'tempo', description: 'Label for the tempo monitor when shown on the stage', @@ -113,6 +227,51 @@ const messages = defineMessages({ description: 'Label for the timer monitor when shown on the stage', id: 'gui.opcodeLabels.timer' }, + sensing_mousedown: { + defaultMessage: 'mouse down?', + description: 'Label for the mouse down monitor when shown on the stage', + id: 'gui.opcodeLabels.mousedown' + }, + sensing_mouseclicked: { + defaultMessage: 'mouse clicked?', + description: 'Label for the mouse clicked monitor when shown on the stage', + id: 'gui.opcodeLabels.mouseclicked' + }, + sensing_mousex: { + defaultMessage: 'mouse x', + description: 'Label for the mouse x monitor when shown on the stage', + id: 'gui.opcodeLabels.mousex' + }, + sensing_mousey: { + defaultMessage: 'mouse y', + description: 'Label for the mouse y monitor when shown on the stage', + id: 'gui.opcodeLabels.mousey' + }, + sensing_getclipboard: { + defaultMessage: 'clipboard item', + description: 'Label for the clipboard item monitor when shown on the stage', + id: 'gui.opcodeLabels.getclipboard' + }, + sensing_getdragmode: { + defaultMessage: 'draggable?', + description: 'Label for the draggable monitor when shown on the stage', + id: 'gui.opcodeLabels.getdragmode' + }, + sensing_loud: { + defaultMessage: 'loud?', + description: 'Label for the loud monitor when shown on the stage', + id: 'gui.opcodeLabels.loud' + }, + sensing_dayssince2000: { + defaultMessage: 'days since 2000', + description: 'Label for the days since 2000 monitor when shown on the stage', + id: 'gui.opcodeLabels.dayssince2000' + }, + sensing_loggedin: { + defaultMessage: 'logged in?', + description: 'Label for the logged in monitor when shown on the stage', + id: 'gui.opcodeLabels.loggedin' + }, // Control control_get_counter: { @@ -147,6 +306,14 @@ class OpcodeLabels { looks_costumenumbername: {category: 'looks'}, looks_backdropnumbername: {category: 'looks'}, looks_backdropname: {category: 'looks'}, + looks_stretchGetX: {category: 'looks'}, + looks_stretchGetY: {category: 'looks'}, + looks_sayWidth: {category: 'looks'}, + looks_sayHeight: {category: 'looks'}, + looks_getEffectValue: {category: 'looks'}, + looks_tintColor: {category: 'looks'}, + looks_getSpriteVisible: {category: 'looks'}, + looks_layersGetLayer: {category: 'looks'}, // Data data_variable: {category: 'data'}, @@ -154,6 +321,7 @@ class OpcodeLabels { // Sound sound_volume: {category: 'sound'}, + sound_getEffectValue: {category: 'sound'}, sound_tempo: {category: 'sound'}, // Sensing @@ -162,6 +330,15 @@ class OpcodeLabels { sensing_username: {category: 'sensing'}, sensing_current: {category: 'sensing'}, sensing_timer: {category: 'sensing'}, + sensing_mousedown: {category: 'sensing'}, + sensing_mouseclicked: {category: 'sensing'}, + sensing_mousex: {category: 'sensing'}, + sensing_mousey: {category: 'sensing'}, + sensing_getclipboard: {category: 'sensing'}, + sensing_getdragmode: {category: 'sensing'}, + sensing_loud: {category: 'sensing'}, + sensing_dayssince2000: {category: 'sensing'}, + sensing_loggedin: {category: 'sensing'}, // Control control_get_counter: {category: 'control'} @@ -193,6 +370,20 @@ class OpcodeLabels { // Looks this._opcodeMap.looks_size.labelFn = () => this._translator(messages.looks_size); + this._opcodeMap.looks_stretchGetX.labelFn = () => this._translator(messages.looks_stretchGetX); + this._opcodeMap.looks_stretchGetY.labelFn = () => this._translator(messages.looks_stretchGetY); + this._opcodeMap.looks_sayWidth.labelFn = () => this._translator(messages.looks_sayWidth); + this._opcodeMap.looks_sayHeight.labelFn = () => this._translator(messages.looks_sayHeight); + this._opcodeMap.looks_getEffectValue.labelFn = params => { + const effect = params.EFFECT.toLowerCase(); + if (messages[`looks_getEffectValue_${effect}`]) { + return this._translator(messages[`looks_getEffectValue_${effect}`]); + } + return this._translator(messages.looks_getEffectValue); + }; + this._opcodeMap.looks_tintColor.labelFn = () => this._translator(messages.looks_tintColor); + this._opcodeMap.looks_getSpriteVisible.labelFn = () => this._translator(messages.looks_getSpriteVisible); + this._opcodeMap.looks_layersGetLayer.labelFn = () => this._translator(messages.looks_layersGetLayer); this._opcodeMap.looks_costumenumbername.labelFn = params => { if (params.NUMBER_NAME === 'number') { return this._translator(messages.looks_costumenumber); @@ -214,6 +405,13 @@ class OpcodeLabels { // Sound this._opcodeMap.sound_volume.labelFn = () => this._translator(messages.sound_volume); this._opcodeMap.sound_tempo.labelFn = () => this._translator(messages.sound_tempo); + this._opcodeMap.sound_getEffectValue.labelFn = params => { + const effect = params.EFFECT.toLowerCase(); + if (messages[`sound_getEffectValue_${effect}`]) { + return this._translator(messages[`sound_getEffectValue_${effect}`]); + } + return this._translator(messages.sound_getEffectValue); + }; // Sensing this._opcodeMap.sensing_answer.labelFn = () => this._translator(messages.sensing_answer); @@ -238,6 +436,15 @@ class OpcodeLabels { } }; this._opcodeMap.sensing_timer.labelFn = () => this._translator(messages.sensing_timer); + this._opcodeMap.sensing_mousedown.labelFn = () => this._translator(messages.sensing_mousedown); + this._opcodeMap.sensing_mouseclicked.labelFn = () => this._translator(messages.sensing_mouseclicked); + this._opcodeMap.sensing_mousex.labelFn = () => this._translator(messages.sensing_mousex); + this._opcodeMap.sensing_mousey.labelFn = () => this._translator(messages.sensing_mousey); + this._opcodeMap.sensing_getclipboard.labelFn = () => this._translator(messages.sensing_getclipboard); + this._opcodeMap.sensing_getdragmode.labelFn = () => this._translator(messages.sensing_getdragmode); + this._opcodeMap.sensing_loud.labelFn = () => this._translator(messages.sensing_loud); + this._opcodeMap.sensing_dayssince2000.labelFn = () => this._translator(messages.sensing_dayssince2000); + this._opcodeMap.sensing_loggedin.labelFn = () => this._translator(messages.sensing_loggedin); // Control this._opcodeMap.control_get_counter.labelFn = () => this._translator(messages.control_get_counter); diff --git a/src/lib/tw-project-meta-fetcher-hoc.jsx b/src/lib/tw-project-meta-fetcher-hoc.jsx index c5b0d09d6bf..b55f324c5fb 100644 --- a/src/lib/tw-project-meta-fetcher-hoc.jsx +++ b/src/lib/tw-project-meta-fetcher-hoc.jsx @@ -95,7 +95,7 @@ const TWProjectMetaFetcherHOC = function (WrappedComponent) { this.props.onSetProjectTitle(title); } const authorName = data.author.username; - const authorThumbnail = `https://localhost:8080/api/v1/users/getpfp?username=${data.author.username}`; + const authorThumbnail = `https://projects.penguinmod.com/api/v1/users/getpfp?username=${data.author.username}`; this.props.onSetAuthor(authorName, authorThumbnail); const instructions = data.desc || ''; const credits = data.notes || ''; diff --git a/src/lib/tw-restore-point-api.js b/src/lib/tw-restore-point-api.js index 0c3435e6414..d758bf0d4c6 100644 --- a/src/lib/tw-restore-point-api.js +++ b/src/lib/tw-restore-point-api.js @@ -362,9 +362,10 @@ const deleteAllRestorePoints = () => openDB().then(db => new Promise((resolveTra /** * @param {VirtualMachine} vm scratch-vm instance * @param {number} id the restore point's ID + * @param {boolean} dontLoadProject if true, the project will not be loaded and this will simply return the sb3 file * @returns {Promise} Resolves with sb3 file */ -const loadRestorePoint = (vm, id) => openDB().then(db => new Promise((resolveTransaction, rejectTransaction) => { +const loadRestorePoint = (vm, id, dontLoadProject) => openDB().then(db => new Promise((resolveTransaction, rejectTransaction) => { const transaction = db.transaction([METADATA_STORE, PROJECT_STORE, ASSET_STORE], 'readonly'); transaction.onerror = () => { rejectTransaction(new Error(`Transaction error: ${transaction.error}`)); @@ -378,6 +379,12 @@ const loadRestorePoint = (vm, id) => openDB().then(db => new Promise((resolveTra // zip in memory. const loadVM = () => { + if (dontLoadProject) { + return resolveTransaction(zip.generateAsync({ + type: 'arraybuffer' + })); + } + resolveTransaction( zip.generateAsync({ // Don't bother compressing it since it will be immediately decompressed @@ -426,7 +433,9 @@ const loadRestorePoint = (vm, id) => openDB().then(db => new Promise((resolveTra }; }; - vm.stop(); + if (!dontLoadProject) { + vm.stop(); + } loadMetadata(); })); diff --git a/src/lib/tw-state-manager-hoc.jsx b/src/lib/tw-state-manager-hoc.jsx index b16278e4f2c..42290fc0dd8 100644 --- a/src/lib/tw-state-manager-hoc.jsx +++ b/src/lib/tw-state-manager-hoc.jsx @@ -360,6 +360,8 @@ const TWStateManager = function (WrappedComponent) { if (urlParams.has('livetests') || String(window.location.href).startsWith(`http://localhost:`)) { // massive mega brained hack bc i cant figure out how to make a state + // ok so now i do know how to make it a state but because of the way + // this is used + pure laziness this wont be changing this.props.vm.isLiveTest = true; } @@ -396,6 +398,12 @@ const TWStateManager = function (WrappedComponent) { dangerousOptimizations: true }); } + + if (urlParams.has('nooffscreen')) { + this.props.vm.setRuntimeOptions({ + disableOffscreenRendering: true + }); + } for (const extension of urlParams.getAll('extension')) { this.props.vm.extensionManager.loadExtensionURL(extension); @@ -520,6 +528,12 @@ const TWStateManager = function (WrappedComponent) { } else { searchParams.delete('optimize'); } + + if (runtimeOptions.disableOffscreenRendering) { + searchParams.set('nooffscreen', ''); + } else { + searchParams.delete('nooffscreen'); + } setSearchParams(searchParams); } @@ -604,7 +618,8 @@ const TWStateManager = function (WrappedComponent) { miscLimits: PropTypes.bool, dangerousOptimizations: PropTypes.bool, fencing: PropTypes.bool, - maxClones: PropTypes.number + maxClones: PropTypes.number, + disableOffscreenRendering: PropTypes.bool }), highQualityPen: PropTypes.bool, framerate: PropTypes.number, diff --git a/src/playground/credits/credits.jsx b/src/playground/credits/credits.jsx index 201b7844c73..db77b2763fa 100644 --- a/src/playground/credits/credits.jsx +++ b/src/playground/credits/credits.jsx @@ -98,7 +98,7 @@ const Credits = () => (

Domain Provider

penguinmod.com (and any subdomains) are currently - provided by NotHouse. + provided by enderhacker.

@@ -118,13 +118,33 @@ const Credits = () => (

The list order is randomized on each refresh.

+

Costumes

+

+ All PenguinMod costumes are downloaded or created from: +

+ All costumes exclusive to PenguinMod are included under Public Domain licenses or licenses such as MIT and CC0. +

+

This is the current list of user-submitted costume creators:

+ +

The list order is randomized on each refresh.

Sound Effects

- PenguinMod has added some more sounds to the Sound Library. - All PenguinMod sounds are - from https://freesound.org/ and https://archive.org/ under - Public Domain licenses. + All PenguinMod sounds are downloaded or created from: +

+ All sounds exclusive to PenguinMod are included under Public Domain licenses or licenses such as MIT and CC0.

+

This is the current list of user-submitted sound creators:

+ +

The list order is randomized on each refresh.

Accounts

Login is managed diff --git a/src/playground/credits/users.js b/src/playground/credits/users.js index 53095256bf9..28c905f43cd 100644 --- a/src/playground/credits/users.js +++ b/src/playground/credits/users.js @@ -25,15 +25,6 @@ const fromHardcodedNamed = username => ({ text: username }); -const fromHardcodedDiscord = async userId => { - const res = await fetch(`https://pmupdatereader.jeremygamer13.repl.co/user/${userId}`); - const json = await res.json(); - return { - image: json.avatarURL, - text: json.username - }; -}; - const addonDevelopers = [ { userId: '34018398', @@ -136,20 +127,73 @@ const pmDevelopers = [ ].map(fromHardcodedGithub); const pmPullRequestDevelopers = [ // these people made a PR that got merged, or got a dev to add something they made - 'NexusKitten', - 'LilyMakesThings', - 'MikeDev101', - 'kokofixcomputers', - 'PPPDUD', - 'qbjl', - 'minidogg', - 'concertalyis', - 'Steve0Greatness', - 'ilikecoding-197', - 'NotEmbin', - 'NotCryptid' // rx or ry single fix + { + text: 'NexusKitten', + image: `https://github.com/NexusKitten.png`, + href: `https://github.com/NexusKitten/`, + }, + { + text: 'LilyMakesThings', + image: `https://github.com/LilyMakesThings.png`, + href: `https://github.com/LilyMakesThings/`, + }, + { + text: 'MikeDev101', + image: `https://github.com/MikeDev101.png`, + href: `https://github.com/MikeDev101/`, + }, + { + text: 'kokofixcomputers', + image: `https://github.com/kokofixcomputers.png`, + href: `https://github.com/kokofixcomputers/`, + }, + { + text: 'PPPDUD', + image: `https://github.com/PPPDUD.png`, + href: `https://github.com/PPPDUD/`, + }, + { + text: 'qbjl', + image: `https://github.com/qbjl.png`, + href: `https://github.com/qbjl/`, + }, + { + text: 'minidogg', + image: `https://github.com/minidogg.png`, + href: `https://github.com/minidogg/`, + }, + { + text: 'concertalyis', + image: `https://github.com/concertalyis.png`, + href: `https://github.com/concertalyis/`, + }, + { + text: 'Steve0Greatness', + image: `https://github.com/Steve0Greatness.png`, + href: `https://github.com/Steve0Greatness/`, + }, + { + text: 'ilikecoding-197', + image: `https://github.com/ilikecoding-197.png`, + href: `https://github.com/ilikecoding-197/`, + }, + { + text: 'NotEmbin', + image: `https://github.com/NotEmbin.png`, + href: `https://github.com/NotEmbin/`, + }, + { // rx or ry single fix + text: 'NotCryptid', + image: `https://penguinmod.com/unknown_user.png`, + href: `https://github.com/NotCryptid/`, + }, + { + text: 'DogeisCut', + image: `https://github.com/DogeisCut.png`, + href: `https://github.com/Dogeiscut/`, + }, // list could be missing some people, but theres not really a way to tell -].map(fromHardcodedGithub); +]; const pmApiDevelopers = [ 'JeremyGamer13', @@ -160,22 +204,26 @@ const pmApiDevelopers = [ 'enderhacker' ].map(fromHardcodedGithub); -// todo: should translators be only named or...? const pmTranslators = [ { text: 'kolikiscool', image: `https://penguinmod.com/unknown_user.png`, - href: "https://jwklong.github.io/penguinmod.github.io/credits.html#", + href: "https://studio.penguinmod.com/credits.html#", }, { text: 'n0name', image: `https://penguinmod.com/unknown_user.png`, - href: "https://jwklong.github.io/penguinmod.github.io/credits.html#", + href: "https://studio.penguinmod.com/credits.html#", }, { text: 'a_pc', image: `https://penguinmod.com/unknown_user.png`, - href: "https://jwklong.github.io/penguinmod.github.io/credits.html#", + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'LoyalBlackBishopyBoi', + image: `https://trampoline.turbowarp.org/avatars/by-username/LoyalBlackBishopyBoi`, + href: "https://scratch.mit.edu/users/LoyalBlackBishopyBoi/", }, { text: 'onetoanother', @@ -215,7 +263,7 @@ const pmTranslators = [ { text: 'SmolBoi37', image: `https://penguinmod.com/unknown_user.png`, - href: "https://jwklong.github.io/penguinmod.github.io/credits.html#", + href: "https://studio.penguinmod.com/credits.html#", }, { text: 'GigantTech', @@ -293,7 +341,7 @@ const pmTranslators = [ { text: 'con-zie', image: `https://penguinmod.com/unknown_user.png`, - href: "https://jwklong.github.io/penguinmod.github.io/credits.html#", + href: "https://studio.penguinmod.com/credits.html#", }, { text: 'ImNotScratchY_lolol', @@ -337,9 +385,154 @@ const pmTranslators = [ }, ]; -const logoArtists = Promise.all([ - '593554048188416001' -].map(fromHardcodedDiscord)); +const pmCostumeSubmittors = [ + // accounts + { + text: 'budc123', + image: `https://github.com/budc123.png`, + href: `https://github.com/budc123/`, + }, + { + text: 'concertalyis', + image: `https://github.com/concertalyis.png`, + href: `https://github.com/concertalyis/`, + }, + { + text: 'WojtekCodesToday', + image: `https://github.com/WojtekCodesToday.png`, + href: `https://github.com/WojtekCodesToday/`, + }, + { + text: 'ddededodediamante', + image: `https://github.com/ddededodediamante.png`, + href: `https://github.com/ddededodediamante/`, + }, + { + text: 'G1nX', + image: `https://trampoline.turbowarp.org/avatars/by-username/G1nX`, + href: "https://penguinmod.com/profile?user=G1nX", + }, + // unknown + { + text: 'maroonmball', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'eviepepsi', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: '1340073', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'cubeycreator', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'novaspiderultra', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'poundpound0209', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'gdplayer1035', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'cognitixsammy', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'thebusyman', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'skyglide5', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'cxnnie09', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'hoveras', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'blockgamer904', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, +]; +const pmSoundSubmittors = [ + // accounts + { + text: 'ddededodediamante', + image: `https://github.com/ddededodediamante.png`, + href: `https://github.com/ddededodediamante/`, + }, + { + text: 'concertalyis', + image: `https://github.com/concertalyis.png`, + href: `https://github.com/concertalyis/`, + }, + { + text: 'G1nX', + image: `https://trampoline.turbowarp.org/avatars/by-username/G1nX`, + href: "https://penguinmod.com/profile?user=G1nX", + }, + // unknown + { + text: 'maroonmball', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'jn567', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'lukepuke311', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'ma_01', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'poundpound0209', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'cognitixsammy', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, + { + text: 'mememaster9000', + image: `https://penguinmod.com/unknown_user.png`, + href: "https://studio.penguinmod.com/credits.html#", + }, +]; const extensionDevelopers = [ 'GarboMuffin', @@ -360,7 +553,7 @@ const pmExtensionDevelopers = [ 'WAYLIVES', 'MrRedstonia', 'MikeDev101', - 'BopShoes', + 'liablelua', 'AlexSchoolOH', 'Monochromasity', 'LilyMakesThings', @@ -370,16 +563,17 @@ const pmExtensionDevelopers = [ 'oc9x97', 'lego7set', 'mariocraft987', - 'Ashimee' + 'AshimeeAlt' ].map(fromHardcodedGithub); export default { addonDevelopers: shuffle(addonDevelopers), pmDevelopers: shuffle(pmDevelopers), - logoArtists: shuffle(logoArtists), extensionDevelopers: shuffle(extensionDevelopers), pmExtensionDevelopers: shuffle(pmExtensionDevelopers), pmApiDevelopers: shuffle(pmApiDevelopers), pmTranslators: shuffle(pmTranslators), + pmSoundSubmittors: shuffle(pmSoundSubmittors), + pmCostumeSubmittors: shuffle(pmCostumeSubmittors), pmPullRequestDevelopers: shuffle(pmPullRequestDevelopers) }; diff --git a/src/playground/render-interface.jsx b/src/playground/render-interface.jsx index 3a97045b6a6..b9525a1ce62 100644 --- a/src/playground/render-interface.jsx +++ b/src/playground/render-interface.jsx @@ -450,7 +450,7 @@ class Interface extends React.Component { className={styles.shareLink} > > {'Copy Link'} diff --git a/src/reducers/tw.js b/src/reducers/tw.js index ca82ab73f69..1fa73e032cd 100644 --- a/src/reducers/tw.js +++ b/src/reducers/tw.js @@ -33,6 +33,7 @@ export const initialState = { maxClones: 300, miscLimits: true, dangerousOptimizations: false, + disableOffscreenRendering: false, fencing: true }, isWindowFullScreen: false, diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..d361c2365daf97043aa0952b4ef3068a2d2a1742 GIT binary patch literal 8993 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 Hu0mjfpV0SZ literal 0 HcmV?d00001 diff --git a/static/images/192.png b/static/images/192.png index 7448b39eb5747a5c7b6020909ffd96503225bda8..17189525e5502d791c53e8caa6d0ee6325f0d1f0 100644 GIT binary patch literal 14175 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

V$~8|db?IDL3j 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 RSyBK1002ovPDHLkV1jlx#n%7; diff --git a/static/images/512.png b/static/images/512.png index a5b9f83c5e8e07c956fb9e0f1f529f827e2d53d9..2d9092986e31c5a792034f2e885c6bc59f872467 100644 GIT binary patch literal 34250 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 Mv**v$obpTlFR8;ohX4Qo diff --git a/static/images/apple-touch-icon.png b/static/images/apple-touch-icon.png index 7cc208ebb3e7eb6b808a97143e6a97ce43cb9c61..17189525e5502d791c53e8caa6d0ee6325f0d1f0 100644 GIT binary patch literal 14175 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 So>@`=0000