authorblues

Untitled

Mar 4th, 2015
396
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ASSUMES the layer1 pointer has already been copied to this stage
  2. function moveAllSublevels(stage, rom)
  3. {
  4.     var sublevels = stage.copyfrom.sublevels.slice(0);
  5.     sublevels[0] = stage.id;
  6.  
  7.     var remap = {}; remap[stage.copyfrom.id] = stage.id;
  8.     for (var i = 1; i < sublevels.length; ++i)
  9.     {
  10.         var id = sublevels[i];
  11.         if ((id & 0x100) !== (stage.id & 0x100))
  12.         {
  13.             var newid = remap[id] = findOpenSublevel(stage.id & 0x100, rom);
  14.             moveSublevel(id, newid, rom);
  15.         }
  16.     }
  17.    
  18.     // fix all screen exits
  19.     for (var i = 0; i < sublevels.length; ++i)
  20.     {
  21.         var id = sublevels[i], exits = getScreenExits(id, rom);
  22.         for (var j = 0; j < exits.length; ++j)
  23.         {
  24.             var x = exits[j], target = getSublevelFromExit(x);
  25.             if (target in remap)
  26.             {
  27.                 var newtarget = remap[target];
  28.                 if (!x.issecx) rom[x.addr+3] = newtarget;
  29.                 else
  30.                 {
  31.                     var secid = x.target;
  32.                     var newsecid = findOpenSecondaryExit(stage.id & 0x100, rom);
  33.                     rom[x.addr+3] = newsecid & 0xFF;
  34.                    
  35.                     // copy all secondary exit tables
  36.                     rom[SEC_EXIT_OFFSET_LO + newsecid] = rom[SEC_EXIT_OFFSET_LO + secid];
  37.                     rom[SEC_EXIT_OFFSET_HI + newsecid] = rom[SEC_EXIT_OFFSET_HI + secid];
  38.                     rom[SEC_EXIT_OFFSET_X1 + newsecid] = rom[SEC_EXIT_OFFSET_X1 + secid];
  39.                     rom[SEC_EXIT_OFFSET_X2 + newsecid] = rom[SEC_EXIT_OFFSET_X2 + secid];
  40.                    
  41.                     // fix secondary exit target
  42.                     rom[SEC_EXIT_OFFSET_LO + newsecid]  = newtarget & 0xFF;
  43.                     rom[SEC_EXIT_OFFSET_HI + newsecid] &= 0xF7;
  44.                     rom[SEC_EXIT_OFFSET_HI + newsecid] |= (newtarget & 0x100) >> 5;
  45.                    
  46.                     // clear old secondary exit target
  47.                     rom[SEC_EXIT_OFFSET_LO + secid]  = 0x00;
  48.                     rom[SEC_EXIT_OFFSET_HI + secid] &= 0xF7;
  49.                 }
  50.             }
  51.         }
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment