Fix melody editor not rendering notes and add math gate to editor/hiding

- Fix edPxPerSec() → edPxPerUnit() crash in edDraw() that prevented
  canvas notes/lanes from rendering (only toolbar was visible)
- Add math gate prompt (simple addition) to openEditor(), hideSong(),
  and hideGenre() for parental control consistency
- Refactor confirmReset() to use shared mathGate() function

https://claude.ai/code/session_01GSG2ymeVdsTegpaKVhQVFF
This commit is contained in:
Claude
2026-04-02 11:55:22 +00:00
parent d1e233d087
commit cffd91e71a
+17 -12
View File
@@ -4587,6 +4587,7 @@ var hiddenGenres=JSON.parse(localStorage.getItem("drgameHidden")||"[]");
var hiddenSongs=JSON.parse(localStorage.getItem("drgameHiddenSongs")||"{}"); var hiddenSongs=JSON.parse(localStorage.getItem("drgameHiddenSongs")||"{}");
function isSongHidden(genre,name){return hiddenSongs[genre]&&hiddenSongs[genre].indexOf(name)>=0;} function isSongHidden(genre,name){return hiddenSongs[genre]&&hiddenSongs[genre].indexOf(name)>=0;}
function hideSong(genre,name){ function hideSong(genre,name){
if(!mathGate("hide this song"))return;
if(!hiddenSongs[genre])hiddenSongs[genre]=[]; if(!hiddenSongs[genre])hiddenSongs[genre]=[];
if(hiddenSongs[genre].indexOf(name)<0)hiddenSongs[genre].push(name); if(hiddenSongs[genre].indexOf(name)<0)hiddenSongs[genre].push(name);
localStorage.setItem("drgameHiddenSongs",JSON.stringify(hiddenSongs)); localStorage.setItem("drgameHiddenSongs",JSON.stringify(hiddenSongs));
@@ -4639,19 +4640,16 @@ function setVolume(v){masterVolume=v/100;syncSliders();saveSettings();}
function resetSettings(){gameSpeed=1.0;masterVolume=1.0;syncSliders();saveSettings();} function resetSettings(){gameSpeed=1.0;masterVolume=1.0;syncSliders();saveSettings();}
function loadSettings(){syncSliders();} function loadSettings(){syncSliders();}
function confirmReset(){ function confirmReset(){
var a=Math.floor(Math.random()*20)+5,b=Math.floor(Math.random()*20)+5; if(!mathGate("reset ALL saved data")){alert("Incorrect — data NOT cleared.");return;}
var ans=prompt("To reset ALL saved data (scores, settings, gamepad mapping, hidden genres), solve this:\n\nWhat is "+a+" + "+b+"?"); localStorage.removeItem("drgame5");localStorage.removeItem("drgameSettings");
if(ans===null)return; localStorage.removeItem("drgameGpMap");localStorage.removeItem("drgameKeyMap");localStorage.removeItem("drgameHidden");localStorage.removeItem("drgameHiddenSongs");
if(parseInt(ans)===a+b){ savedScores=[];hiddenGenres=[];hiddenSongs={};gpMap={0:2,1:3,2:0,3:1,4:4,5:5,6:6,7:7,8:4};customKeyMap=null;
localStorage.removeItem("drgame5");localStorage.removeItem("drgameSettings"); LANES[0].key="f";LANES[1].key="g";LANES[2].key="h";LANES[3].key="j";LANES[4].key=" ";LANES[5].key="d";LANES[6].key="k";LANES[7].key="l";
localStorage.removeItem("drgameGpMap");localStorage.removeItem("drgameKeyMap");localStorage.removeItem("drgameHidden");localStorage.removeItem("drgameHiddenSongs"); refreshMiniLB();resetSettings();buildMenu();
savedScores=[];hiddenGenres=[];hiddenSongs={};gpMap={0:2,1:3,2:0,3:1,4:4,5:5,6:6,7:7,8:4};customKeyMap=null; alert("All data cleared!");
LANES[0].key="f";LANES[1].key="g";LANES[2].key="h";LANES[3].key="j";LANES[4].key=" ";LANES[5].key="d";LANES[6].key="k";LANES[7].key="l";
refreshMiniLB();resetSettings();buildMenu();
alert("All data cleared!");
} else {alert("Incorrect — data NOT cleared.");}
} }
function hideGenre(g){ function hideGenre(g){
if(!mathGate("hide this genre"))return;
if(hiddenGenres.indexOf(g)<0)hiddenGenres.push(g); if(hiddenGenres.indexOf(g)<0)hiddenGenres.push(g);
localStorage.setItem("drgameHidden",JSON.stringify(hiddenGenres)); localStorage.setItem("drgameHidden",JSON.stringify(hiddenGenres));
if(curGenre===g){var allG=Object.keys(SYNTH_GENRES).concat(Object.keys(GENRES));curGenre=allG.find(function(x){return hiddenGenres.indexOf(x)<0;})||allG[0];curIdx=0;} if(curGenre===g){var allG=Object.keys(SYNTH_GENRES).concat(Object.keys(GENRES));curGenre=allG.find(function(x){return hiddenGenres.indexOf(x)<0;})||allG[0];curIdx=0;}
@@ -4816,7 +4814,14 @@ function edLaneToY(l){
return ED_HEAD+4*ED_LANE_H+ED_KICK_H/2; return ED_HEAD+4*ED_LANE_H+ED_KICK_H/2;
} }
function mathGate(actionLabel){
var a=Math.floor(Math.random()*20)+5,b=Math.floor(Math.random()*20)+5;
var ans=prompt("To "+actionLabel+", solve this:\n\nWhat is "+a+" + "+b+"?");
if(ans===null)return false;
return parseInt(ans)===a+b;
}
function openEditor(){ function openEditor(){
if(!mathGate("edit this melody"))return;
var pieces=SYNTH_GENRES[curGenre]||GENRES[curGenre]; var pieces=SYNTH_GENRES[curGenre]||GENRES[curGenre];
if(!pieces||!pieces[curIdx])return; if(!pieces||!pieces[curIdx])return;
edPiece=pieces[curIdx]; edPiece=pieces[curIdx];
@@ -4863,7 +4868,7 @@ window.addEventListener("resize",function(){if(document.getElementById("sed").cl
function edDraw(){ function edDraw(){
var cv=getEdCanvas(),ctx=getEdCtx(),W=cv.width,H=cv.height; var cv=getEdCanvas(),ctx=getEdCtx(),W=cv.width,H=cv.height;
ctx.clearRect(0,0,W,H); ctx.clearRect(0,0,W,H);
var pps=edPxPerSec(); var pps=edPxPerUnit();
// Draw lane backgrounds // Draw lane backgrounds
for(var i=0;i<4;i++){ for(var i=0;i<4;i++){