Neopets Classic, Ruffle and forcing native Flash

For support with specific websites

Moderator: trava90

Forum rules
Please always mention the name/domain of the website in question in your topic title.
Please one website per topic thread (to help keep things organized). While behavior on different sites might at first glance seem similar, they are not necessarily caused by the same.

Please try to include any relevant output from the Toolkit Error Console or the Developer Tools Web Console using the following procedure:
  1. Clear any current output
  2. Navigate or refresh the page in question
  3. Copy and paste Errors or seemingly relevant Warnings into a single [ code ] block.
User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-01, 04:21

A triumph has turned into a tragedy. Some days ago, I discovered Neopets Classic. When a specific Flash asset on its site failed due to Ruffle shenanigans, I reported the bug, but the administrator responded by forcing Ruffle emulation everywhere. This simply will not do, for reasons I trust anybody here should understand. Regrettably, the kind administrator seemed not to recognise that Pale Moon is a modern browser which happens to retain NPAPI support, and that it apparently caused no problems hitherto to offer native SWF alongside Ruffle for those who need it. I feel quite bad about myself, since asking for help from the Neopets Classic staff ended up making things objectively worse. :(

A demo page exists for testing. Rather like how we have found ways to make the Internet Archive display true Flash instead of Ruffle, I hope this could be done for Neopets Classic. (Until then, I have self-frozen my NC account, so no Aishas starve while studying this.) On the Internet Archive, the µBlock rules

Code: Select all

||web.archive.org/_static/js/ruffle.js[/ic]
||https://web-static.archive.org/_static/js/ruffle/ruffle.js
||web.archive.org/_static/js/ruffle/ruffle.js$script,domain=web.archive.org
have served admirably since 2024. On Neopets Classic, my own inferred ||neopetsclassic.com/*/ruffle.js or ||neopetsclassic.com/static/images/swf/ruffle/ruffle.js simply replace the buggy Ruffle blocks with the message Ruffle failed to load. I sincerely hope a remedy can be found, for I feel it is my fault for breaking the Flash assets in the first place.
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
FranklinDM
Add-ons Team
Add-ons Team
Posts: 647
Joined: 2017-01-14, 02:40
Location: Philippines

Re: Neopets Classic, Ruffle and forcing native Flash

Post by FranklinDM » 2026-08-01, 16:33

From what I can tell, they're now using Ruffle directly (instantiating flash parameters using Ruffle and WebComponents instead of object element). Modify HTTP Response or a similar tool might be needed to re-write those back into a real Flash object.

User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-01, 23:46

FranklinDM wrote:
2026-08-01, 16:33
Modify HTTP Response or a similar tool might be needed to re-write those back into a real Flash object.
I think I have already got that extension installed, but how would I use it to achieve this?
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
moonbat
Knows the dark side
Knows the dark side
Posts: 5917
Joined: 2015-12-09, 15:45

Re: Neopets Classic, Ruffle and forcing native Flash

Post by moonbat » 2026-08-02, 01:23

Mæstro wrote:
2026-08-01, 23:46
I think I have already got that extension installed, but how would I use it to achieve this?
You have to write a filter for it - adoxa to the rescue :)
"One hosts to look them up, one DNS to find them and in the darkness BIND them."

Image
KDE Neon on a Slimbook Excalibur (Ryzen 7 8845HS, 64 GB RAM)
AutoPageColor|PermissionsPlus|PMPlayer|Pure URL|RecordRewind|TextFX
Jabber: moonbat@hot-chili.net

User avatar
adoxa
Astronaut
Astronaut
Posts: 706
Joined: 2019-03-16, 13:26
Location: Qld, Aus.

Re: Neopets Classic, Ruffle and forcing native Flash

Post by adoxa » 2026-08-02, 01:58

I was hoping to point to another version of SWFObject, but looks like only 2.2 is on a CDN, not 1.5 (but knowing what I know now, I don't think it would have worked anyway). Here's a rather big filter that incorporates a simplified 1.5 directly. I've only tested the demo page, but it should work with everything.

Code: Select all

[["neopetsclassic.com",["/swfobject/",["/[\\s\\S]*/","typeof window.deconcept=='undefined'&&(window.deconcept={},window.deconcept.util={},window.deconcept.SWFObjectUtil={});window.deconcept.SWFObject=function(a,b,w,h,e,c,g){this.params={};this.variables={};this.attributes=Array();a&&this.setAttribute('swf',a);b&&this.setAttribute('id',b);w&&this.setAttribute('width',w);h&&this.setAttribute('height',h);c&&this.addParam('bgcolor',c);this.addParam('quality',g||'high')};window.deconcept.SWFObject.prototype={setAttribute:function(A,_){this.attributes[A]=_},getAttribute:function(B){return this.attributes[B]},addParam:function(C,_b){this.params[C]=_b},getParams:function(){return this.params},addVariable:function(_a,d){this.variables[_a]=d},getVariables:function(){return this.variables},getVariablePairs:function(){var D=Array(),_B,_c=this.getVariables();for(_B in _c)D[D.length]=_B+'='+_c[_B];return D},getSWFHTML:function(){var _A='<embed type=\\\"application/x-shockwave-flash\\\" src=\\\"'+this.getAttribute('swf')+'\\\" width=\\\"'+this.getAttribute('width')+'\\\" height=\\\"'+this.getAttribute('height')+'\\\" style=\\\"'+this.getAttribute('style')+'\\\"',E=this.getParams(),_d=this.getVariablePairs().join('&');_A+=' id=\\\"'+this.getAttribute('id')+'\\\" name=\\\"'+this.getAttribute('id')+'\\\" ';for(var _C in E)_A+=[_C]+'=\\\"'+E[_C]+'\\\" ';_d.length>0&&(_A+=`flashvars=\"${_d}\"`);_A+='/>';return _A},write:function(aA){typeof __20=='undefined'&&(aA=this.getAttribute('id'),document.write(`<span id=\"${escape(aA)}\"></span>`));var n=(typeof aA=='string')?document.getElementById(aA):aA;n.innerHTML=this.getSWFHTML();return!0}};window.deconcept.util={getRequestParameter:function(aB){var q=document.location.search||document.location.hash;if(aB==null)return q;if(q){var aC=q.substring(1).split('&');for(var i=0;i<aC.length;i++)if(aC[i].substring(0,aC[i].indexOf('='))==aB)return aC[i].substring((aC[i].indexOf('=')+1))}return''}};window.getQueryParamValue=deconcept.util.getRequestParameter;window.SWFObject=deconcept.SWFObject;"]]]]

User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-02, 02:42

adoxa wrote:
2026-08-02, 01:58
I've only tested the demo page, but it should work with everything.
Thank you first for sweeping in so soon! I tried this right away. When I paste this into the Filters box in the add-ons menu and tick the box to enable, I receive the following filter error:
SyntaxError: JSON.parse: expected ',' or ']' after array element at line 1 column 4371 of the JSON data
The box then clears itself, without any rule being added in the editor. The 4370th character in the filter is the " preceding the word undefined, which seems an unlikely place to insert a comma or square bracket. Am I applying the filter wrong?
If, alternatively, I use Modify HTTP’s editor with host neopetsclassic.com, path swfobject, search /[\\s\\S]*/ and replace

Code: Select all

/** * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: * http://www.opensource.org/licenses/mit-license.php * */ if(typeof deconcept==\"undefined\"){var deconcept=new Object();}if(typeof deconcept.util==\"undefined\"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil==\"undefined\"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:\"detectflash\";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute(\"swf\",_1);}if(id){this.setAttribute(\"id\",id);}if(w){this.setAttribute(\"width\",w);}if(h){this.setAttribute(\"height\",h);}if(_5){this.setAttribute(\"version\",new deconcept.PlayerVersion(_5.toString().split(\".\")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam(\"bgcolor\",c);}var q=_7?_7:\"high\";this.addParam(\"quality\",q);this.setAttribute(\"useExpressInstall\",false);this.setAttribute(\"doExpressInstall\",false);var _c=(_8)?_8:window.location;this.setAttribute(\"xiRedirectUrl\",_c);this.setAttribute(\"redirectUrl\",\"\");if(_9){this.setAttribute(\"redirectUrl\",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?\"expressinstall.swf\":_d;this.setAttribute(\"useExpressInstall\",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+\"=\"+_18[key];}return _16;},getSWFHTML:function(){var _19=\"\";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute(\"doExpressInstall\")){this.addVariable(\"MMplayerType\",\"PlugIn\");this.setAttribute(\"swf\",this.xiSWFPath);}_19=\"<embed type=\\\"application/x-shockwave-flash\\\" src=\\\"\"+this.getAttribute(\"swf\")+\"\\\" width=\\\"\"+this.getAttribute(\"width\")+\"\\\" height=\\\"\"+this.getAttribute(\"height\")+\"\\\" style=\\\"\"+this.getAttribute(\"style\")+\"\\\"\";_19+=\" id=\\\"\"+this.getAttribute(\"id\")+\"\\\" name=\\\"\"+this.getAttribute(\"id\")+\"\\\" \";var _1a=this.getParams();for(var key in _1a){_19+=[key]+\"=\\\"\"+_1a[key]+\"\\\" \";}var _1c=this.getVariablePairs().join(\"&\");if(_1c.length>0){_19+=\"flashvars=\\\"\"+_1c+\"\\\"\";}_19+=\"/>\";}else{if(this.getAttribute(\"doExpressInstall\")){this.addVariable(\"MMplayerType\",\"ActiveX\");this.setAttribute(\"swf\",this.xiSWFPath);}_19=\"<object id=\\\"\"+this.getAttribute(\"id\")+\"\\\" classid=\\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\\" width=\\\"\"+this.getAttribute(\"width\")+\"\\\" height=\\\"\"+this.getAttribute(\"height\")+\"\\\" style=\\\"\"+this.getAttribute(\"style\")+\"\\\">\";_19+=\"<param name=\\\"movie\\\" value=\\\"\"+this.getAttribute(\"swf\")+\"\\\" />\";var _1d=this.getParams();for(var key in _1d){_19+=\"<param name=\\\"\"+key+\"\\\" value=\\\"\"+_1d[key]+\"\\\" />\";}var _1f=this.getVariablePairs().join(\"&\");if(_1f.length>0){_19+=\"<param name=\\\"flashvars\\\" value=\\\"\"+_1f+\"\\\" />\";}_19+=\"</object>\";}return _19;},write:function(_20){if(this.getAttribute(\"useExpressInstall\")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute(\"version\"))){this.setAttribute(\"doExpressInstall\",true);this.addVariable(\"MMredirectURL\",escape(this.getAttribute(\"xiRedirectUrl\")));document.title=document.title.slice(0,47)+\" - Flash Player Installation\";this.addVariable(\"MMdoctitle\",document.title);}}if(this.skipDetect||this.getAttribute(\"doExpressInstall\")||this.installedVer.versionIsValid(this.getAttribute(\"version\"))){if(typeof _20=="undefined")_20=this.getAttribute('id'),document.write(`<span id=\"${escape(_20)}\"></span>`);var n=(typeof _20==\"string\")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute(\"redirectUrl\")!=\"\"){document.location.replace(this.getAttribute(\"redirectUrl\"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins[\"Shockwave Flash\"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\\s)+/,\"\").replace(/(\\s+r|\\s+b[0-9]+)/,\".\").split(\".\"));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf(\"Windows CE\")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.\"+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");}catch(e){try{var axo=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess=\"always\";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable(\"$version\").split(\" \")[1].split(\",\"));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split(\"&\");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf(\"=\"))==_2b){return _2d[i].substring((_2d[i].indexOf(\"=\")+1));}}}return \"\";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName(\"OBJECT\");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display=\"none\";for(var x in _2f[i]){if(typeof _2f[i][x]==\"function\"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent(\"onunload\",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent(\"onbeforeunload\",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
I no longer get the Ruffle failed to load message, but the demo is just blank for me.
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
adoxa
Astronaut
Astronaut
Posts: 706
Joined: 2019-03-16, 13:26
Location: Qld, Aus.

Re: Neopets Classic, Ruffle and forcing native Flash

Post by adoxa » 2026-08-02, 03:02

The filter is just shy of 2K, so I guess you already had another filter? (Ah no, you got the old one, not the silently updated one.) It won't work in the editor, since the format is different. Here's what you want for the replace field (and just use single backslashes in the search field).

Code: Select all

typeof window.deconcept=='undefined'&&(window.deconcept={},window.deconcept.util={},window.deconcept.SWFObjectUtil={});window.deconcept.SWFObject=function(a,b,w,h,e,c,g){this.params={};this.variables={};this.attributes=Array();a&&this.setAttribute('swf',a);b&&this.setAttribute('id',b);w&&this.setAttribute('width',w);h&&this.setAttribute('height',h);c&&this.addParam('bgcolor',c);this.addParam('quality',g||'high')};window.deconcept.SWFObject.prototype={setAttribute:function(A,_){this.attributes[A]=_},getAttribute:function(B){return this.attributes[B]},addParam:function(C,_b){this.params[C]=_b},getParams:function(){return this.params},addVariable:function(_a,d){this.variables[_a]=d},getVariables:function(){return this.variables},getVariablePairs:function(){var D=Array(),_B,_c=this.getVariables();for(_B in _c)D[D.length]=_B+'='+_c[_B];return D},getSWFHTML:function(){var _A='<embed type=\"application/x-shockwave-flash\" src=\"'+this.getAttribute('swf')+'\" width=\"'+this.getAttribute('width')+'\" height=\"'+this.getAttribute('height')+'\" style=\"'+this.getAttribute('style')+'\"',E=this.getParams(),_d=this.getVariablePairs().join('&');_A+=' id=\"'+this.getAttribute('id')+'\" name=\"'+this.getAttribute('id')+'\" ';for(var _C in E)_A+=[_C]+'=\"'+E[_C]+'\" ';_d.length>0&&(_A+=`flashvars="${_d}"`);_A+='/>';return _A},write:function(aA){typeof __20=='undefined'&&(aA=this.getAttribute('id'),document.write(`<span id="${escape(aA)}"></span>`));var n=(typeof aA=='string')?document.getElementById(aA):aA;n.innerHTML=this.getSWFHTML();return!0}};window.deconcept.util={getRequestParameter:function(aB){var q=document.location.search||document.location.hash;if(aB==null)return q;if(q){var aC=q.substring(1).split('&');for(var i=0;i<aC.length;i++)if(aC[i].substring(0,aC[i].indexOf('='))==aB)return aC[i].substring((aC[i].indexOf('=')+1))}return''}};window.getQueryParamValue=deconcept.util.getRequestParameter;window.SWFObject=deconcept.SWFObject;

User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-02, 03:34

After applying the corrected filters recommended in your second post, I get the red Ruffle blocks with Etwas ist schiefgelaufen :( (Something has gone wrong) which mean a Ruffle asset is trying to load and whining since it has not got all its JavaScript toys. This is the regular site behaviour without the µBlock filters, which I have disabled in any case. Applying the silently corrected filter from your first post instead renders a blank.
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
adoxa
Astronaut
Astronaut
Posts: 706
Joined: 2019-03-16, 13:26
Location: Qld, Aus.

Re: Neopets Classic, Ruffle and forcing native Flash

Post by adoxa » 2026-08-02, 08:06

Sorry, I don't know what to tell you. I deleted my existing filter, copied in what I posted, enabled, and it worked. ... Hm, okay, it works in Basilisk, but not in PM - the embed is created, but it's not asking me to activate Flash. Sorry, I don't know what's going on there. ... Even weirder, if I save it and load the local copy, it works.

User avatar
Moonchild
Project founder
Project founder
Posts: 39718
Joined: 2011-08-28, 17:27
Location: Sweden

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Moonchild » 2026-08-02, 09:04

Unfortunately there seems to be an additional issue. From the Neopets Classic staff. Exchange:
Aaron (NPC) wrote:I’m really sorry to be the bearer of disappointing news, especially as I understand that native Flash support was one of the things that attracted you to the site. Native Flash taking priority over Ruffle was actually an oversight rather than an intentionally supported configuration.

A significant amount of our Flash content has been modified specifically to work through Ruffle's emulation. This is why many games and features work here despite remaining broken on Neopets.com. When the native Flash plugin takes priority instead, several areas of the site no longer function correctly, including the Wheel of Knowledge, the Kelp menu pages, and Neohomes. We have therefore had to standardise Flash content around Ruffle. Almost all of our users access the site through modern browsers, and many play entirely on mobile devices, so requiring a specialist browser and legacy plug-in would unfortunately make this content inaccessible to the majority of the community.
Moonchild wrote: I understood through our own forum that it was actually working fine before, and having a regular object for the flash content would simply fall back to ruffle anyway if no plugin was available. Pale Moon -is- a modern browser but not required if ruffle is used with a standard flash object first like it apparently was until very recently.
Aaron (NPC) wrote:You’re correct that it was rendering native flash in supported browsers until recently but as mentioned that was an oversight unfortunately. We had incorrectly assumed that Ruffle would take priority which wasn’t the case. We’ve modified a lot of swfs to make them functional again which means they are now broken with native flash. In order to have everything functional regardless of browser we had to make that adjustment to force Ruffle.
So I'm very sad that the much more performant native SWF has been relegated to the wayside here by having the SWFs edited by them to cater to ruffle's limitations, but as a result breaking with native SWF use through the official plugin. There should be a solution serving the originals through swf objects and the edited ones through ruffle but I do understand that might just be a lot of effort they just don't want to put into supporting the original content through the official plugin due to our limited market share. Sadly, ruffle really isn't focused on anything but Blink at this time and it's glitchy and sometimes simply broken outside of that engine.
"Sales hates anything that can't be turned into a confident sentence." - anonymous warehouse worker
"Why debate someone you fundamentally don't trust?" - Dario Amodei
"Seek wisdom, not knowledge. Knowledge is of the past; wisdom is of the future." -- Native American proverb
"Linux makes everything difficult." -- Lyceus Anubite

User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-03, 00:04

adoxa wrote:
2026-08-02, 08:06
Hm, okay, it works in Basilisk, but not in PM - the embed is created, but it's not asking me to activate Flash. Sorry, I don't know what's going on there. ... Even weirder, if I save it and load the local copy, it works.
When I try in freshly installed Basilisk, using your second filter, the Ruffle version of the demo plays. If I try to save it, the total file size is two kilobytes, and the site information does not reveal any plug-in; no embedded Flash asset is yielded. Thanks for trying, in any case.
I could discover that Neopets Classic uses a separate script, swfobject.js, in addition to ruffle.js by doing this. I offer this in the unlikely event this information might further help.
Moonchild wrote:
2026-08-02, 09:04
So I'm very sad that the much more performant native SWF has been relegated to the wayside here by having the SWFs edited by them to cater to ruffle's limitations, but as a result breaking with native SWF use through the official plugin. There should be a solution serving the originals through swf objects and the edited ones through ruffle but I do understand that might just be a lot of effort they just don't want to put…
It is quite sad. I feel calmer about it than the day Aaron told me he was mandating Ruffle, but my disappointment about it reminds me bitterly of how I was upset as a child when Neopets revised itself in 2007, or how countless other sites would adopt mobile-centric interfaces beginning in the mid-tens. There are other Neopets recreations out there which might not suffer the same fault that Neopets Classic does now, but it is probably better for my psyche if I treat Neopets as simply lost this side of eternity, as I supposed it was until discovering Neopets Classic with working Flash.

Even more perversely, Ruffle is meant to detect and yield to genuine Flash if available. (My own past experiences with this on the Archive were even referenced!) Not even Ruffle’s own developers think it should displace authentic Flash.
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-03, 16:20

adoxa wrote:
2026-08-03, 07:18
Went with a Greasemonkey script [for Newgrounds.]
Could something like this work for Neopets Classic? I have long had Greasemonkey installed for other purposes.
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
andyprough
Forum staff
Forum staff
Posts: 1662
Joined: 2020-05-31, 04:33

Re: Neopets Classic, Ruffle and forcing native Flash

Post by andyprough » 2026-08-03, 18:35

Moonchild wrote:
2026-08-02, 09:04
many play entirely on mobile devices
I would imagine this is the bigger issue. Most users are just thumbing through the game on their phones. No amount of desktop browser plugin work is going to make a bit of difference for them.

User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-03, 23:51

andyprough wrote:
2026-08-03, 18:35
I would imagine this is the bigger issue. Most users are just thumbing through the game on their phones. No amount of desktop browser plugin work is going to make a bit of difference for them.
Indeed. I admit reading that in Aaron’s explanation had disturbed me more than any other single item in what he cordially told me. I should expect a website devoted to faithfully recreating an online experience which antedates the rise of smartphones to be the last place to cater to smartphone users, not least at the expense of people capable of interacting with the site as originally designed. I cannot help but feel Neopets Classic’s choice misses the point.
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
adoxa
Astronaut
Astronaut
Posts: 706
Joined: 2019-03-16, 13:26
Location: Qld, Aus.

Re: Neopets Classic, Ruffle and forcing native Flash

Post by adoxa » 2026-08-04, 02:20

Here's the same thing as a userscript, with the same outcome - works for me in Basilisk, but not PM (yet Newgrounds works where it does something similar; even directly replacing the page with the embed doesn't work).

Code: Select all

// ==UserScript==
// @name        Neopets Classic Flash
// @namespace   adoxa
// @description Restore Flash plugin on Neopets Classic.
// @include     https://neopetsclassic.com/*
// @version     1
// @grant       none
// @run-at      document-start
// ==/UserScript==
Object.defineProperty(window, "SWFObject", {writable: false, value:
    function(swf, id, w, h, ver, c, quality) {
        this.params = new Object();
        this.variables = new Object();
        this.attributes = new Array();
        if(swf) { this.setAttribute('swf', swf); }
        if(id) { this.setAttribute('id', id); }
        if(w) { this.setAttribute('width', w); }
        if(h) { this.setAttribute('height', h); }
        if(c) { this.addParam('bgcolor', c); }
        var q = quality ? quality : 'high';
        this.addParam('quality', q);
    }
});
SWFObject.prototype = {
    setAttribute: function(name, value){
        this.attributes[name] = value;
    },
    getAttribute: function(name){
        return this.attributes[name];
    },
    addParam: function(name, value){
        this.params[name] = value;
    },
    getParams: function(){
        return this.params;
    },
    addVariable: function(name, value){
        this.variables[name] = value;
    },
    getVariables: function(){
        return this.variables;
    },
    getVariablePairs: function(){
        var variablePairs = new Array();
        var key;
        var variables = this.getVariables();
        for(key in variables){
            variablePairs[variablePairs.length] = key +"="+ variables[key];
        }
        return variablePairs;
    },
    getSWFHTML: function() {
        var swfNode = '<embed type="application/x-shockwave-flash" src="'+ this.getAttribute('swf') +'" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'"';
        swfNode += ' id="'+ this.getAttribute('id') + '" name="'+ this.getAttribute('id') +'" ';
        var params = this.getParams();
         for(var key in params){ swfNode += [key] + '="'+ params[key] + '" '; }
        var pairs = this.getVariablePairs().join("&");
         if (pairs.length > 0){ swfNode += 'flashvars="'+ pairs +'"'; }
        swfNode += '/>';
        return swfNode;
    },
    write: function(elementId){
        if(typeof elementId == "undefined") {
            elementId = this.getAttribute('id') + '_container';
            document.write(`<span id="${escape(elementId)}"></span>`);
        }
        var n = (typeof elementId == "string") ? document.getElementById(elementId) : elementId;
        n.innerHTML = this.getSWFHTML();
        return true;
    }
};

User avatar
Mæstro
Board Warrior
Board Warrior
Posts: 1279
Joined: 2019-08-13, 00:30
Location: Casumia

Re: Neopets Classic, Ruffle and forcing native Flash

Post by Mæstro » 2026-08-04, 02:41

adoxa wrote:
2026-08-04, 02:20
Here's the same thing as a userscript, with the same outcome - works for me in Basilisk, but not PM…
Curious, for Basilisk behaves otherwise for me when I try it with the newest UXP Greasemonkey after confirming Modify HTTP is disabled to avoid interference. For me, the userscript causes the demo page to load a white blank. Is this the mode of failure you observe in Pale Moon? The situation is both awkward and hopeful when I experience errors you do not suffer. I prefer to treat the matter as hopeful.
Life is a fever dream Mæstro would enjoy.
All posts 100% organic. Ash is the best letter.
What is being nice online?
Debian 10 ELTS / Official PM build

User avatar
frostknight
Board Warrior
Board Warrior
Posts: 1068
Joined: 2022-08-10, 02:25

Re: Neopets Classic, Ruffle and forcing native Flash

Post by frostknight » 2026-08-04, 04:24

Thing I hate is, Ruffle is made with rust and rust is a hugely bloated programming language.

All this bs about "memory safety" is a bunch of crap.
Freedom is never more than one generation away from extinction. Feelings are not facts
If you wish to be humbled, try to exalt yourself long term If you wish to be exalted, try to humble yourself long term
Favourite operating systems: Hyperbola Devuan OpenBSD
Say NO to Fascism and Corporatism as much as possible!
Also, Peace Be With us All!

User avatar
andyprough
Forum staff
Forum staff
Posts: 1662
Joined: 2020-05-31, 04:33

Re: Neopets Classic, Ruffle and forcing native Flash

Post by andyprough » 2026-08-04, 05:25

Mæstro wrote:
2026-08-04, 02:41
Curious, for Basilisk behaves otherwise for me when I try it with the newest UXP Greasemonkey after confirming Modify HTTP is disabled to avoid interference. For me, the userscript causes the demo page to load a white blank.
I get lots of animation when I have the user script in the new Greasemonkey on Basilisk, and I did not remove Modify HTTP Response. Did you name it neopets.user.js, and then create a zip file from it, and then import it into Greasemonkey?
Screenshot_2026-08-04_00-19-44.jpg
Screenshot_2026-08-04_00-20-01.jpg
Screenshot_2026-08-04_00-20-37.jpg
Screenshot_2026-08-04_00-20-53.jpg
Screenshot_2026-08-04_00-31-24.jpg
You do not have the required permissions to view the files attached to this post.

User avatar
adoxa
Astronaut
Astronaut
Posts: 706
Joined: 2019-03-16, 13:26
Location: Qld, Aus.

Re: Neopets Classic, Ruffle and forcing native Flash

Post by adoxa » 2026-08-04, 07:53

Okay, created a new profile in Basilisk, installed uBO & Greasemonkey, added the userscript, went to the demo page, blank. Deleted everything in that profile, cloned my default, worked. Tracked it down to config security.csp.enable - set that to false and it works.

User avatar
andyprough
Forum staff
Forum staff
Posts: 1662
Joined: 2020-05-31, 04:33

Re: Neopets Classic, Ruffle and forcing native Flash

Post by andyprough » 2026-08-04, 14:37

adoxa wrote:
2026-08-04, 07:53
Okay, created a new profile in Basilisk, installed uBO & Greasemonkey, added the userscript, went to the demo page, blank. Deleted everything in that profile, cloned my default, worked. Tracked it down to config security.csp.enable - set that to false and it works.
I have security.csp.enable set to true on basilisk with uBO and Greasemonkey installed, and the demo page still works.