Posts for partyboy1a

1 2
9 10 11
15 16
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
I created a mask which marks most of the defects caused by MFlowFPS:
#AVISource("#2223 - cpadolf's SNES Super Metroid ''any%, glitched''.avi").ConvertToRGB32 
AVIsource("test-blend.avi").ConvertToRGB32

 v1 = TASBlend    .PointResize(512, 448) 
 v2 =              PointResize(512, 448).ConvertToYUY2.TASBlend_nanogyth.ConvertToRGB32 
 v3 =              PointResize(512, 448).ConvertToYUY2.TASBlend_extendednanogyth2.ConvertToRGB32 
 v4 = TASBlend_Vit.PointResize(512, 448) 

 StackVertical( stackhorizontal(last.PointResize(512, 448).selecteven, last.PointResize(512, 448).selectodd), \
 StackHorizontal(v1.Subtitle("TASBlend"         ), v4.Subtitle("TASBlend_Vit"     )), \
 stackHorizontal(v2.Subtitle("TASBlend_nanogyth"), v3.Subtitle("TASBlend_extendednanogyth")))




 function TASBlend_nanogyth(clip c)  { 
         c 
         Assert(!IsRGB, "TASBlend_nanogyth: clip cannot be RGB") 
         Interleave(SelectEven.dbz.SelectEvery(4, 0), 
         \          SelectOdd .dbz.SelectEvery(4, 1)) 
 }
 
  function TASBlend_nanogyth_custom(clip c,int delta)  { 
         c 
         Assert(!IsRGB, "TASBlend_nanogyth: clip cannot be RGB") 
         Interleave(SelectEven.dbz_custom(delta).SelectEvery(4, 0), 
         \          SelectOdd .dbz_custom(delta).SelectEvery(4, 1)) 
 }
  
  function differenceclip(clip a, clip b)
{
	overlay( \
		a.overlay(b.invert,mode="add",pc_range=true).invert, \
		b.overlay(a.invert,mode="add",pc_range=true),mode="add",pc_range=true \
	).invert.greyscale.levels(2,1,3,0,255)
}

  function differenceclip_weak(clip a, clip b)
{
	overlay( \
		a.overlay(b.invert,mode="add",pc_range=true).invert, \
		b.overlay(a.invert,mode="add",pc_range=true),mode="add",pc_range=true \
	).invert.greyscale.levels(2,1,70,0,255)
}
  
 function TASBlend_Vit(clip c, float "ratio")  { 
         # reduces framerate to 1/2 but leaves flicker effects partly visible 
         # blends frame pairs with alternating opacity (default is 2/3 + 1/3;1/3 + 2/3) 
         # optional "ratio" is the opacity of the first frame out of the four 
         ratio   = default(ratio, 2.0/3) 
         opacity = round(ratio * 257) 
         # blend flicker to half-rate 
         c.SelectEvery(4, 1, 0, 2, 3) 
         blend = Layer(SelectEven, SelectOdd, level=opacity) 
         # determine flicker is a simplistic way - compare each pixel with the previous and next two frames 
         similar2   = 1  # how similar current pixel must be to the same pixel 2 frames forwards and backwards 
         different1 = 8  # how different current pixel must be from the same pixel 1 frame forwards and backwards 
         mask_f2 = Overlay(c, c.SelectEvery(1, 2), mode="difference", pc_range=true).Greyscale.Levels(128 + similar2  , 1.0, 129 + similar2  , 0, 255, false).Invert 
         mask_f1 = Overlay(c, c.SelectEvery(1, 1), mode="difference", pc_range=true).Greyscale.Levels(128 + different1, 1.0, 129 + different1, 0, 255, false) 
         mask_b1 = Overlay(c, c.SelectEvery(1,-1), mode="difference", pc_range=true).Greyscale.Levels(128 + different1, 1.0, 129 + different1, 0, 255, false) 
         mask_b2 = Overlay(c, c.SelectEvery(1,-2), mode="difference", pc_range=true).Greyscale.Levels(128 + similar2  , 1.0, 129 + similar2  , 0, 255, false).Invert 
         mask_f  = Overlay(mask_f1, mask_f2, mode="multiply", pc_range=true) 
         mask_b  = Overlay(mask_b1, mask_b2, mode="multiply", pc_range=true) 
         mask    = Overlay(mask_f,  mask_b,  mode="multiply", pc_range=true).SelectEven 
         # only use blend where detected flicker 
         Layer(c.SelectEven, blend.mask(mask)) 
 }
  
  function TASBlend_extendednanogyth(clip c)  {
		ng = TASBlend_nanogyth(c)
		m=differenceclip(ng,TASBlend_nanogyth_custom(c,1))
		m=overlay(m,differenceclip(ng,c.selecteven).invert,mode="add",pc_range=true)
		m=overlay(m,differenceclip(ng,c.selecteven.deleteframe(0)).invert,mode="add",pc_range=true).converttorgb32.levels(250,1,251,0,255)
		almostfinal = overlay(ng, c.selecteven, mask=m)
		return almostfinal
        return differenceclip(almostfinal, TASBlend_Vit(c.converttorgb32))
 }
 
   function TASBlend_extendednanogyth2(clip c)  {
		ng = TASBlend_nanogyth(c)
		m = differenceclip(ng,TASBlend_nanogyth_custom(c,2))
		m2 = differenceclip(ng,TASBlend_nanogyth_custom(c,3))
		mask0 = overlay(m,m2,mode="add",pc_range=true)
		ng2 = TASBlend_nanogyth(c.deleteframe(0))
		m3 = differenceclip(ng,ng2.duplicateframe(0))
		mask1 = overlay(mask0, m3, mode="add",pc_range=true)
		#return overlay(ng, mask1, mask=mask1, pc_range=true)
		#return overlay(c.selecteven, ng, mask=mask1.invert)
		#return overlay(c.selecteven, mask1, mask=mask1)
		mask2 = overlay(mask1.invert.greyscale.levels(127,1,128,0,255), differenceclip(ng, c.selecteven),mode="add")
		mask3 = overlay(mask2, differenceclip(ng, c.selectodd), mode="subtract").greyscale
		return ng.overlay(mask3.invert,mask=mask3.invert)
		return overlay(mask3,mask4.invert,mode="add")
		return overlay(ng, mask3.invert, mask=mask3.invert)
 }
 
  function dbz(clip c)  { 
         super        = c.MSuper(pel=2) 
		 backward_vec = MAnalyse(super, isb=true) 
         forward_vec  = MAnalyse(super, isb=false) 
         MFlowFps(c, super, backward_vec, forward_vec, num=60, den=1, ml=100) 
 }
 
 function dbz_custom(clip c, int delta)  { 
         super        = c.MSuper(pel=2) 
		 backward_vec = MAnalyse(super, isb=true,delta=delta) 
         forward_vec  = MAnalyse(super, isb=false,delta=delta) 
         MFlowFps(c, super, backward_vec, forward_vec, num=60, den=1, ml=100) 
 }


 function TASBlend(clip c) {
	ratio = 2.0/3
	opacity = round(ratio * 257)
	c.SelectEvery(4, 1, 0, 2, 3) 
    blend = Layer(SelectEven, SelectOdd, level=opacity) 
	Layer(c.SelectEven, blend)
 }
 
I tested this code with this video which has fast movement and flicker at the same time . edit: seems to be a bit too restrictive in the super metroid video...
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
That's some funny glitches... I would vote yes for not aiming on fastest time, but on a glitchfest instead. That's way more interesting to watch. Some of these glitches might even save time -- those where you warp from the left edge of the screen to the right edge.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
The least would be one reference for all. For example this one which is even more evil, as it has animations with a length of 4 frames... I originally found it at Combovid.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
creaothceann wrote:
Why not detect flickering pixels and apply TASBlend only to those pixels? -Vit- posted this code:
function TASBlend(clip c, float "ratio")  { 
        # reduces framerate to 1/2 but leaves flicker effects partly visible
 ...
}
If only the mask was better, or if the motion estimation nanogyth posted didn't produce these bad artifacts... Then we would have a better solution than global TASblend or 20fps videos right now.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
It doesn't matter if the firefalls are much faster, only if they are a bit faster than all the other characters (and if the fireball doesn't vanish too fast)... You would just have to fire them early enough, they will sooner or later reach the right edge of the screen... And there would be a huge difference for this strategy between real time and in-game time for sure. The penalty from the frozen overall-movement might be too big for a real time run in most locations. It would save time in a few places The slow speed is no problem if you destroy the bubble right before the flagpole, or a pipe. And it might require quite crazy setups, like Fiery Mario staying on top of "Propeller" Luigi (is that the right term?) to throw the fireball on Toad from a high location, but beforehand, Luigi must get to the bottom of the level to increase the overall screen size, making sure the bubble starts from a very far place... I think a run of this game should be going for fastest in-game time anyway, since these can be compared easier, and the speed-up from aiming on real time doesn't make the run more interesting... For example, you would have to avoid collecting power-ups as much as possible when aiming for real-time, which will lead to a minimum amount of changes in power-ups. Manipulating the bubbles to go to the right side is probably the faster strategy -- if you have enough control over them... It's most likely not worth to waste any time for those manipulations.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
STOP doing all those combos... That was funny to watch.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Well, it becomes even more complicated If someone dies, there is a small delay, and the bubble starts from the right side again -- and it can be hit by a fireball from fiery Mario (or Luigi or Toad)... This means that the fastest strategy could be to have one die many times just to join again from a bubble at the right side... And the more distance between the other players, the larger the current screen becomes, the further to the right the dead player joins the scene in a bubble...
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Hehe... the fifth "boss" fight was really fast... It's defeated before I have even realized what has to be done in that fight. Is there no way to fly even more in that stage? Flying is apparently much faster than walking, and you're walking sometimes. And have you tested different "firing" patterns during flight, something like (^>)(>)(^>)(^>)(>) ? They might reduce fuel consumption while still letting you fly high enough. There is one more little thing which might save one frame each time When you need to change the direction (lets say from left to right), you shouldn't only test (<)(<)(<)(>)(>) or such, but also (<)(<)()(>)(>) or (<)(<)()()(>)(>)... and who knows what effects could be caused by (<^>) or (<v>) or (<^v>). When you're walking, you're most likely required to do such things automatically, but you might easily forget about that during flights... Well, the first time you did a turnaround in flight was in stage 5 anyway. The TAS is looking really good. I hope to see the last stage finished soon.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
I have already tried to draw additional sprites on SNES. The result was quite horrible. Something was drawn, but definitely not the same sprite (and it introduced desyncs...) And drawing the sprite pixel-by-pixel would introduce another problem: The sprites must be drawn in the right order... I will give this a try though, but it will definitely take a lot more time. It might be difficult to guess which sprites are of the same "type" (for example being part of one character, part of his movement animation, part of his damage animation...) -- this is required for motion interpolation. If we can find an absolutely reliable way for detecting such, it would be game-independent, and remain "only" console-dependant... (Well -- as long as no effects are applied after drawing the layers. Example: water levels in Donkey Kong Country.)
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
oops, there were some errors in my initial code... This clip really has this awkward solution, but it doesn't seem to make the encode significantly larger... The best solution for the flicker would be to drop every other frame, but beforehand, force the game into producing 15Hz flicker... Let's say the flicker problem only occurs on the sprite layer, and the sprite layer is drawn on top of all others, and there are no effects applied afterwards. Then some Lua script could read the sprite data, and try to detect flicker. When 30Hz flicker starts on an odd frame (let's say frame 1 it's visible, frame 2 invisible), it would let frame 1 untouched, add the sprite to frame 2, and delete the sprite from frame 3, and let frame 4 untouched, let frame 5 untouched, add the sprite to frame 6, ... Ideally it would be added exactly on the right location by the game's logic. If now every even or odd frame is taken, the flicker is now 15Hz. Well... that is not only console-dependent, but even game-dependent, this would definitely be too much work for encoders.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
That's somewhat funny... your results appear to be better than mine. If the problem is that the blinking doesn't work as good as it should, you might use the same idea twice:
LoadCplugin("yadif.dll")

original = AVIsource("test-blend.avi").pointresize(256,448).killaudio() 
even = original.selecteven() 
odd = original.selectodd() 
maskclip1 = ImageReader("blackwhite-test.png",1,10000,30).pointresize(256,224) 
maskclip = stackvertical(maskclip1, maskclip1) 

temp1 = even.overlay(odd, mask=maskclip, opacity = 0.7) 
temp2 = odd.overlay(even, mask=maskclip, opacity = 0.3) 
firstresult = interleave(temp1.selecteven(), temp2.selectodd()).converttoyv12().yadif(order=1)

original2 = original.deleteframe(0)
even2 = original2.selecteven() 
odd2 = original2.selectodd() 
temp2_1 = even2.overlay(odd2, mask=maskclip, opacity = 0.7) 
temp2_2 = odd2.overlay(even2, mask=maskclip, opacity = 0.3) 
secondresult = interleave(temp2_1.selecteven(), temp2_2.selectodd()).converttoyv12().yadif(order=1)

return firstresult.pointresize(256,896).overlay(secondresult.pointresize(256,896), mask=stackvertical(maskclip,maskclip)).yadif(order=1)
This isn't looking good enough for my test movie, it's still not better than a simple 20fps encode... but the GIFs you made looked quite good.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Baxter wrote:
"no left+right warp on the level select screen" and "no 1-1 warps"
Well... these rules are more complicated than just "no glitch-warps", but still absolutely clear. I assume that you will use every single chance for in-level glitch-warps then -- as long as they save time. This is one of the longest projects, but this run will most probably become the best TAS ever made. Go on with the good work!
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
SoulCal I would recommend you to get a SNES TAS working on an actual console. There is BSNES, which claims to be extremely accurate. Another good thing is that it doesn't use any high level emulation... Well, you would need to add rerecording features for the emulator first, but I think your chances to succeed are much higher. The emulator also has a very readable source code, so this should be relatively easy for a skilled programmer. And most of the reverse-engineering for the controllers is already done... I wish you good luck for whatever you're going to try. I would try to get some game working which doesn't have any SRAM, as this eliminates one source for errors in sync. I don't know if such an N64 game exists.
Post subject: more-intellegent-than-a-hexeditor
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Well... I think this Lua script is a nice alternative to using a hexeditor. The best thing is that you can instantly see any in-game changes you do to the initial file. It takes some time to get used to it, but it works as intended. Just wanted to share it with you, so it can become even better. (the tablehandling.lua file is only for saving and loading) Edit: I'm trying to build a GUI for the above script with IUP. It's somewhat strange, but now the "tablehandling" part will make the emulator crash. This file has a minimum example for that. starting "no-crash.lua" and pressing F12 + frameadvance will load a big table (~6mb). if you start "iup-crash.lua", and click the "load" button, which attempts to load the same table with the very same function, it will crash. if you replace recorded.txt with t.txt (a much smaller table), both will work fine. Any idea what caused the crash?
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
kooz wrote:
[1] neat graphics glitch in Plok Town, I've never seen that. Is that a side-effect of the mid-air sawblade activation you discovered? [2] I'm both surprised and pleased that the Penkinos battle was as optimized as possible! I was specifically thinking of that fight when I mentioned how difficult the bosses are. [3]
I also could verify that you can skip parts of the last levels.
Wow, nice find. It looks similar to the glitch I found to pass through spikes in Silent Running, but I don't see you taking damage... Is that just a small opening in the barrier (level design oversight), or did you discover some sort of maneuver to glitch through there? [4] Bah! I can't believe my Womack fight was so poorly optimized! I'm sure all that time didn't just come from sliding down that hill either. From what I can tell, the strategy is the same (pre-fire a limb and use high jump to elevate it). I'm curious to know how you improved it so much, with apparently even further improvement to be had.
1) Yes, that's the effect of pressing left+right... If you do that while walking, you will go to the left, but it will show the "standing still" animation. 2) Well... I couldn't concentrate on so many enemies at once, and your solution seems very good. I'll test if you can die at this stage after killing the boss without having to fight again... This can be done on any flea level without fighting the fleas a second time, but there is absolutely no place in the entire game where this could save time. 3) I think that one is a level design oversight. And it wasn't me who discovered that, but someone posted that it is possible in one of the messages to your publication. 4) 2 seconds come from the slide. I could do the 2nd hit a lot earlier than you... You haven't seen that you can take damage from the spider while it is going upwards. Here you can get a nice Lua script. It effectively allows you to do hex-editing "in realtime", and it shows many important memory addresses. You are required to have tablehanding.lua in the same folder. ------------------------------------------------------------------ Yay, 8 more frames saved till Bobbin Bros... Those slopes are just so insanely hard to optimize. And I found a new strategy which is at least as fast as the previous one for this boss. ------------------------------------------------------------------ Yay, yet another shortcut of 10 seconds
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
If the trick can be performed in Cheese Bridge Area, this would allow two more exits to be completed in the small-only run. An any% TAS for an original game should skip as much of the game as possible -- that's in fact what it's all about. But I don't think it's a good idea to do the very same on a hack which is most probably much less known. Well, this is clearly not the opinion of the majority here. (Side note: This site is about tool assisted superplay movies, not only about tool assisted speedruns.)
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Well... the TAS was quite good. How does the jump-in-air trick work you do in the third level? Can it be done as small Mario? Can it also be done in the original SMW game, or is that impossible due to the level layout? Was this game even meant to be playable on an actual console? I won't vote on this one. The hack was way too hard, and you skipped parts of the level that the designer of the hack thought to be mandatory. I dislike the idea to create a hack first, and then show how to skip these parts. I would prefer a playaround which shows how the hacker intended the hack to be played.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Someone on IRC had the following idea: take odd lines from frame 1, merge with even lines from frame 2 ---> frame 1 take even lines from frame 3, merge with odd lines from frame 4 ---> frame 2 ... and so on. I tested how it looks like, but it wasn't good. I did the following: take line 1 from frame 1, line 1 from frame 2, line 2 from frame 1, line 2 from frame 2, line 3 from frame 1, line 3 from frame 2, ... -> frame 1 take line 1 from frame 4, line 1 from frame 3, line 2 from frame 4, line 2 from frame 3, line 3 from frame 4, line 3 from frame 3, ... -> frame 2 (blackwhite-test.png is a 1x224 picture consisting of a white pixel followed by a black pixel followed by a white pixel followed by a black pixel ...) That's the AVIsynth code to do that (given the input video is 256x224)
original = AVIsource("test-blend.avi").pointresize(256,448).killaudio()
even = original.selecteven()
odd = original.selectodd()
maskclip1 = ImageReader("blackwhite-test.png",1,10000,30).pointresize(256,224)
maskclip = stackvertical(maskclip1, maskclip1)

temp1 = even.overlay(odd, mask=maskclip, opacity = 0.7)
temp2 = odd.overlay(even, mask=maskclip, opacity = 0.3)
return interleave(temp1.selecteven(), temp2.selectodd())
What do you think about the result for 70% / 30% or the result with 100% / 100% with deinterlacer ?
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Derakon wrote:
I'd say go with the (E) version. The improvement from running in NTSC is not particularly interesting IMO, and there's a lot of text to read throughout the game.
+1
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
This would be a bad game choice for sure... I think you're talking about this game. We already have the NES version published here, and I don't think that the one extra level and the few extra graphics would be enough for either another publication or to obsolete the current run. Or you must find an Arcade-specific glitch that can be abused.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
I feel that you broke your own rules in 2-1 by using the pipe in the wrong direction. I consider this to be a glitch-warp. You were just lucky that this one leads to the next level section. The run itself was fantastic.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
I should have waited with the update until the race and Womack Spider was done... Both could be optimized pretty well. Just watch this one... Although this is for sure not as optimized as it could be, it's several seconds faster than in the published movie.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Bad sounds, bad graphics, bad game choice, repetetiveness. You can guess my vote.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
Has someone tried to glitch into the "switch palace" level outside of the castle before collecting any stars or Bowser keys? The game might assume that you previously lowered the water level then... or you might start to swim on exiting, and when touching the ground, the "I got a star" animation might start (if you collected the star), allowing you to stand in water for a short time. I don't know if that is even possible... In any case, this would save time for the 120 stars run, as you would never have to leave the castle.
Experienced Forum User, Published Author, Player (136)
Joined: 9/18/2007
Posts: 389
As nearly every source has some misleading information about warps, here is a summary about all the warps of this game: Levels Level number & Level name & Bonus Type & Warp Destination Cotton Island 1-1 & Beach & Race against time & 1-6 1-2 & Bridge 1-3 & Columns & Race against time & 1-7 1-4 & Log Falls & Shell game & 1-5 1-5 & Ricketry Bridge & Race against time & 1-8 1-6 & Crazy Cradles 1-7 & Blind Leap & Race against time & 2-3 1-8 & Bobbin Bros Acryllic 2-1 & Garlen Beach & Shell game & 2-2 2-2 & Sleepy Dale 2-3 & Ploks House Legacy Island 3-1 & Mace Cove 3-2 & Fool's Gap 3-3 & Zig Zag 3-4 & Sponge Rocks & Shell Game & 3-6 3-5 & Swifty Peaks 3-6 & Log Falls 3-7 & Crouch Hill 3-8 & Bobbin Bros Acryllic 4-1 & Plok Town & Bonus Room & (no warp) 4-2 & The Penkinos 4-3 & Venge Thicket & Shell game & 4-4 4-4 & Dreamy Cove & Race against time & 4-6 4-5 & Creepy Forest 4-6 & Womack Spider 4-7 & Creepy Crag 4-8 & Gohome Cavern 4-9 & Crashing Rocks & Race against time & 5-3 4-10 & Rockyfella Fleapit 5-1 & Cycling Clever 5-2 & Road Hogging 5-3 & High Flying 5-4 & Easy Riding 5-5 & In a spin! 5-6 & Real Rumblings 5-7 & Silent Running 5-8 & The Flea Queen
                                                      *****************
                                                      * Warp overview *
                                                      *****************

                                              /- RACE AGAINST TIME ------------\
                                              |                                |
                        /---------------------- RACE AGAINST TIME --\          |          /SHELL GAME\
                        |                     |                     |          |          |          |
 1-1........1-2........1-3........1-4........1-5........1-6........1-7........1-8........2-1........2-2........2-3........3-1
  |                                |          |          |          |                                           |
  |                                \SHELL GAME/          |          |                                           |
  |                                                      |          |                                           |
  \------------- RACE AGAINST TIME ----------------------/          \------ RACE AGAINST TIME ------------------/
  

 3-1........3-2........3-3........3-4........3-5........3-6........3-7........3-8........4-1........4-2........4-3
  .                                |                     |                                .
  .                                \---- SHELL GAME -----/                                .
  .                                                                                       .
  \.................................... easy mode path .................................../
 

  /SHELL GAME\								  
  |          |
 4-3........4-4........4-5........4-6........4-7........4-8........4-9........4-10........5-1........5-2........5-3
             |                     |                                |                                            |
             \- RACE AGAINST TIME -/                                \-------------- RACE AGAINST TIME -----------/


 5-3........5-4........5-5........5-6........5-7........5-8........END

(TODO: easy mode ends earlier)
------------------------------------------------------------------------------------ I could gain 38 frames in Plok Town, and copying the old boss fight worked... I don't see anything I could improve about it. The shell game in Venge Thicket is approximately 2100 frames faster than completing the level on the normal way. I was able to shorten the race in Dreamy Cove by at least 1.8 seconds... no more waiting for those stupid rotating platforms. ------------------------------------------------------------------------------------ I'm sure that it wouldn't be acceptable to publish a warped run and a warpless run here if there is no additional restriction on the warpless run. The warped run plays 20 stages out of a total of 37 stages exactly as it would be done in a warpless run. There are only 11 levels completely missing in the warped run. (And the remaining 6 stages are those where I use a warp.) The "no damage" restriction would enforce different strategies on those two runs, which would especially make the bosses look very different. ------------------------------------------------------------------------------------ I also could verify that you can skip parts of the last levels. WIP25 on youtube , and the input file
1 2
9 10 11
15 16