Sure~ add me on Discord. hawkwhisper
I'm the chonky bird
Although I do plan to make an entirely new one (more optimized, etc) for MZ, I just don't know when.
TheUnproPro
Creator of
Recent community posts
Bruh your answers are on time compared to me, my answers are slower than a -- well lets not go there~
"
it just gets so close to nailing the look i want that im making sure im happy with it before moving with the rest of the stuff lol"
My guy, I'm genuinely happy you have this kind of mindset, it means you have legit potential to become a coder yourself, and a very good one, persistence on a problem is what drives me as well, I spend like 2 months on a dumb issue with Linux Kernel code and trying to write a custom driver for some hardware, not because I found it fun (at first I did), but because I didnt want to move on until I conquered that b* lol
I have in fact moved on without conquering it but Ill be back, lol
"
was wondering if messing with just some of the values could i just increase it a bit to get the blur i want while having it at 0.7?"
Yep, from here you can share the code with GPT or Gemini and they will help you better understand my packed spaghetti code lol
You dont need to apologize~ So basically, I forgot that I only included the frag / vert files so people can read how they work, but I actually packed the contents
in superRetroPlus.js~ replace the line on 272:
var compositeFragSource = **big a* code line here lol**
With this one:
const mixValue = 0.5; var compositeFragSource = `varying vec2 vTextureCoord;
uniform sampler2D uSampler;
uniform float delta;
uniform float canvasWidth;
uniform float canvasHeight;
uniform float positionX;
uniform float positionY;
uniform float signal;
uniform float sync;
uniform float scanlines;
uniform bool enabled;
uniform bool interlacing;
uniform vec2 texsize;
uniform float checker_size;
float checker(vec2 uv, float repeats) {
float cx = floor(repeats * uv.x);
float cy = floor(repeats * uv.y); float result = mod(cx + cy, 2.0);
return sign(result);
} void main(void) {
vec4 color = texture2D(uSampler, vTextureCoord); if(sync != 0.0) {
for(float i=0.0;i<0.0005;i+=0.00006) {
for(float j=-0.0003;j<0.0003;j+=0.0003) {
vec4 colCopy = texture2D(uSampler, vTextureCoord);
color = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.t+sin(gl_FragCoord.t / sync)));
}
}
} if(interlacing == true) {
vec4 lineDown = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.t+(0.78539816345 / (canvasHeight * 2.0))));
vec4 lineUp = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.t-(0.78539816345 / (canvasHeight * 2.0))));
float checkFor = cos(gl_FragCoord.y+(delta*2.0));
if(checkFor >= (3.1415926538 / 4.0)) {
color = lineDown / 4.0;
} else {
color = lineUp / 4.0;
} color *= 4.0;
}
if(enabled == true) {
vec4 color2 = texture2D(uSampler, vTextureCoord); float result = (cos(gl_FragCoord.s*3.1415926538) + sin(gl_FragCoord.t*3.1415926539)) / 1.0;
color2.r /= (result+cos(delta) / 32.0);
color2.g /= result;
color2.b /= result; color.r += cos(delta/1.1+cos(delta))*(color2.r / 7.0);
color.g += cos(-delta+cos(delta))*(color2.g / 7.0);
color.b += cos(delta+cos(delta))*(color2.b / 7.0);
color.r+=cos(gl_FragCoord.x * 2.0) / 32.0;
color /= 1.33;
color.b /= 1.15;
for(float i=0.0;i<0.0005;i+=0.00006) {
for(float j=-0.0003;j<0.0003;j+=0.0003) {
color += (texture2D(uSampler, vec2(vTextureCoord.x+i/1.90, vTextureCoord.y+(j/3.1415926538)))) / 4.0 - (signal / 1000.0);
color -= (texture2D(uSampler, vec2(vTextureCoord.x+(i/3.1415926538), vTextureCoord.y+(j/3.1415926538)))) / 4.0 - (signal / 1000.0);
color.g *= 1.001;
color += (texture2D(uSampler, vec2(vTextureCoord.x-i/1.90, vTextureCoord.y+(j/3.1415926538)))) / 4.0 - (signal / 1000.0);
color -= (texture2D(uSampler, vec2(vTextureCoord.x-(i/3.1415926538), vTextureCoord.y+(j/3.1415926538)))) / 4.0 - (signal / 1000.0);
color.g /= 1.001;
color += (texture2D(uSampler, vec2(vTextureCoord.x+i/1.90, vTextureCoord.y-(j/3.1415926538)))) / 4.0 - (signal / 1000.0);
color -= (texture2D(uSampler, vec2(vTextureCoord.x+(i/2.0), vTextureCoord.y-(j/3.1415926538)))) / 4.0 - (signal / 1000.0);
color.b *= 1.001;
color += (texture2D(uSampler, vec2(vTextureCoord.x-i/1.80, vTextureCoord.y-(j/3.1415926538)))) / 5.0;
color -= (texture2D(uSampler, vec2(vTextureCoord.x-(i/2.0), vTextureCoord.y-(j/3.1415926538)))) / 5.0;
color.b /= 1.001;
color.r *= 1.0015;
color += (texture2D(uSampler, vec2(vTextureCoord.x-i/1.91, vTextureCoord.y-(j/3.1415926538)))) / 8.0;
color -= (texture2D(uSampler, vec2(vTextureCoord.x-(i/2.0), vTextureCoord.y-(j/3.1415926538)))) / 8.0; color.r /= 1.001;
}
} if(signal >= 1.0) {
for(float i=0.0;i<0.0005;i+=0.00006) {
for(float j=-0.0003;j<0.0003;j+=0.0003) {
color += (texture2D(uSampler, vec2((sin(delta*signal))+vTextureCoord.x+i/1.90, vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((cos(delta*signal))+vTextureCoord.x+(i/3.1415926538), vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color.g *= 1.001;
color += (texture2D(uSampler, vec2((cos(delta*signal))+vTextureCoord.x-i/1.90, vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((sin(delta*signal))+vTextureCoord.x-(i/3.1415926538), vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color.g /= 1.001;
color += (texture2D(uSampler, vec2((sin(delta*signal))+vTextureCoord.x+i/1.90, vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((cos(delta*signal))+vTextureCoord.x+(i/2.0), vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color.b *= 1.001;
color += (texture2D(uSampler, vec2((cos(delta*signal))+vTextureCoord.x-i/1.80, vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((sin(delta*signal))+vTextureCoord.x-(i/2.0), vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color.b /= 1.001; color += (texture2D(uSampler, vec2((sin(delta*signal))-vTextureCoord.x+i/1.90, vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((cos(delta*signal))-vTextureCoord.x+(i/3.1415926538), vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color.g *= 1.001;
color += (texture2D(uSampler, vec2((cos(delta*signal))-vTextureCoord.x-i/1.90, vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((sin(delta*signal))-vTextureCoord.x-(i/3.1415926538), vTextureCoord.y+(j/3.1415926538)))) / 77.0 - signal;
color.g /= 1.001;
color += (texture2D(uSampler, vec2((sin(delta*signal))-vTextureCoord.x+i/1.90, vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((cos(delta*signal))-vTextureCoord.x+(i/2.0), vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color.b *= 1.001;
color += (texture2D(uSampler, vec2((cos(delta*signal))-vTextureCoord.x-i/1.80, vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color -= (texture2D(uSampler, vec2((sin(delta*signal))-vTextureCoord.x-(i/2.0), vTextureCoord.y-(j/3.1415926538)))) / 77.0 - signal;
color.b /= 1.001; }
}
}
}
if(scanlines > 0.0) {
color -= sin(vTextureCoord.t * (canvasHeight * 1.5)) / (100.0 - scanlines);
} gl_FragColor = mix(color, texture2D(uSampler, vTextureCoord), ${mixValue});
}`;
Basically just delete the original compositeFragSource var, and paste all of the code block there in~
Now just edit mixValue (If this doesnt work I'll get more hands on and we can use discord)
Ok so~ open "composite.frag"
On line 27:
void main(void) {
vec4 color = texture2D(uSampler, vTextureCoord);
Add this under vec4 color:
vec4 basexx = texture2D(uSampler, vTextureCoord);
Next, scroll down to the bottom where you see:
gl_FragColor = color;
}
Replace the gl_FragColor = color with the following:
gl_FragColor = mix(color, basexx, 0.5);
From here, just edit the "0.5" value until you get a result you like <3
It is indeed quite impressive, as for MV/MZ while they are fantastic, every export no matter the device will export to a web format, on PC it uses NW.js (node webkit), like CrossCode does, this makes games easier to hack and even flat out edit, though to be 100% honest, no game is safe from that regardless of the engine lol.
As for reverse engineering the shader, turns out now you need to link your own gl program it looks like, and store the frag/vert shaders in an object, I just need to figure out why/how a glProgram is now required and how to tie that to the renderer, gonna attempt to just bootleg it and use the main app's glProgram
I appreciate the offer though~
But yeah, the TL;DR version is WebGPU is significantly faster, also optimized asf for newer mobile devices (or even some older ones with updated web rendering, w/e browser you use), The down side is, GLSL code wont work out of the box with it, apparently? Idk man, some jank sh* going down rn on PIXI's side lol, like they're improving which is amazing, but they've also made custom shaders obscure asf, I'll try deconstructing a built in shader and see if I can't figure out クソ何で makes them work~
The title names should be the name of the image file you want to add to the list of swappable title screen images :)
"
i've been trying to logic the code but i keep getting reminded that i have the most rudimentary coding experience (think: hello world) ;;
"
^ Welcome to the world of coding =D It's always awesome to hear someone putting in the effort to learn, though it can be a real headache;
About toggling plugins mid-game, yeah atm that's not really an option, I mean it -kind of- can be, but it'd be a bit bootleg on how it needs to be done lol~ Anyway here's the commented version:
// Extending Scene_Title prototype to add custom properties
(() => {
// Custom properties for the title scene
Scene_Title.prototype.title_timer = 0; // Timer for tracking time
Scene_Title.prototype.title_image_index = 0; // Index to track the current title image
Scene_Title.prototype.title_images = [
"title_1_name",
"title_2_name",
"etc",
].map(t => ImageManager.loadTitle1(t)); // Array of title images loaded using ImageManager
// Save the original update function of Scene_Title
const originalUpdate = Scene_Title.prototype.update;
// Override the update function to add custom logic
Scene_Title.prototype.update = function() {
// Call the original update function
originalUpdate.call(this, arguments);
// Increment the title timer
this.title_timer++;
// Check if 2.5 seconds (2500 milliseconds) have passed
if (this.title_timer >= 2500) {
// Increment the title image index
this.title_image_index++;
}
// Check if the current title image is loaded
if (this._backSprite1._imageLoaded != this.title_image_index) {
// Update the loaded image index
this._backSprite1._imageLoaded = this.title_image_index;
// Set the bitmap of _backSprite1 to the current title image
this._backSprite1.bitmap = this.title_images[this.title_image_index];
}
// Wrap around the title_image_index to prevent going beyond the array length
this.title_image_index = this.title_image_index % this.title_images.length;
};
})();Ah~ I can give you a rundown way to do it-
Make a "title_change.js" file, put it in plugins, give it the following content:
(()=>{
Scene_Title.prototype.title_timer = 0;
Scene_Title.prototype.title_image_index= 0;
Scene_Title.prototype.title_images = [
"title_1_name",
"title_1_name",
"etc",
].map(t=>ImageManager.loadTitle1(t));
const osu = Scene_Title.prototype.update;
Scene_Title.prototype.update = function() {
osu.call(this, arguments);
this.title_timer++;
if(this.title_timer>=2500) //2.5 seconds
this.title_image_index++;
if(this._backSprite1._imageLoaded != this.title_image_index) {
this._backSprite1._imageLoaded = this.title_image_index;
this._backSprite1.bitmap = this.title_images[this.title_image_index];
}
this.title_image_index = this.title_image_index%this.title_images.length;
}
})();
Put it on top of the other plugins;I don't know if this will work right off the bat, but~ play around with it, it should work :)


















