Posts for FractalFusion


Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
- The Youtube video at the top is not an encode of this TAS. It was placed there to mislead. The actual encode is in jlun2's second post of this thread. - This TAS does not complete the game. There are seven days, not four. - The "credits" shown in the encode on day 4 are neither the ending nor credits of this game. They are the "credits" of the in-game "cursed RPG" which is central to the story.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
How does a 4/1 submission devolve into this after one day? Only on TASVideos. Since it is evident that this thread will no longer serve anything useful, it will be locked. Spikestuff, stop posting image macros and videos that serve nothing useful except to degrade threads, before we have to ban you.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Interesting Let's Play: http://www.youtube.com/watch?v=5j92NO7UkW8 Also, the "hack" patch is 3582KB. In comparison, the patch for Super Demo World TLC is 1515KB. Clearly this Xka Shack hack must be the best SMW hack ever, right? In seriousness, it doesn't qualify as a hack of SMW, or a hack of anything in particular. It is nothing but homebrew, and it isn't even a game. That's why the patch is 3582KB; the ROM itself is 3649KB and has nothing to do with SMW. (SDW-TLC's ROM is 6145KB.)
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
By the way, the actual VBM file crashes VBA at frame 44077, around where execution of the payload would normally begin in bortreb's TAS.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
If it is an emulator problem, then that's a shame. By the way, the description mentions nothing about input lag, only "lag frames" (i.e. like in other games/TASes where lag is not expected to be a quantity that is stockpiled by breaking bottles and released by doing nothing), and, to someone who reads it for the first time, doesn't explain why the players stopped for about 10 seconds instead of just grinding up to 72 or whatever the max is. I know now that it is an intended tradeoff, but it might not be clear to others.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Glad to see a serious submission in the midst of a lot of nonsense. Two-player runs are usually more enjoyable than one-player runs, and the microphone minigame must have been pretty hard to pull off. However, I'm not sure why both players stopped during the milk-drinking minigame; wouldn't the scores be a lot higher if you kept it up? I like it, so that is a yes vote from me.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Requesting encode. [/henke37]
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I know the run is supposed to be 27 minutes long, and Youtube says it is 22:55 long because of scenes that play at 200fps, but shouldn't we be doing something about this instead of pretending that nothing is wrong? Looking only at the Youtube video, one might think that antd screwed up the encode, or is reporting false times. Or that the run is a (non-assisted) speed run and not a TAS.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Unless I'm mistaken, the Nicovideo module on this site allows watching movies without an account. Just click the play button on the module. You can also use nicozon. For example, http://www.nicozon.net/watch/sm20413380 .
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
February 2013 ranking: Link to video Nothing out of the ordinary here, other than that 30th place has 21102 points, down from 62633 points of last month's 30th place, and two of the best TASes to exist come in at numbers 1 and 2.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
FODA wrote:
At 0:35 was there enough time to get into flight right after dropping the bomb so you could kill that thing without stopping?
Whenever the player lands to plant a bomb (that is lands by dropping down, not by flying horizontally onto the ledge), it is not possible (as far as I checked) to fly up soon enough before the bomb explodes. There is a delay when trying to fly up. And yes, the POWER bar is just a timer.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Posted on Nicovideo (author is tianwodeai(天我的愛) ): Link to video Link to video
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Dooty wrote:
Samlaptop wrote:
'Simon Sezs' should be 'Simon Says'
Weird, I took it from a respected walkthrough writer, but I'll fix it, thanks.
Nonstandard spellings may occur from influence of pop culture, comedic nature, or parody. Take it with a grain of salt.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Hm. I never expected my submission to generate half the attention it actually received. It seems that this run is judged to obsolete [url= http://tasvideos.org/2187M.html]bortreb's run[/url]. That's unfortunate, since bortreb put in way more effort (even constructing the TAS entirely from botted input). Just by looking at the submission text, it is clear that he knows GB specs inside out, something that I cannot lay claim to. Without bortreb's run, this submission would not exist. We should all thank him for such an innovative run. In comparison, my TAS is not innovative. If bortreb chose to do a Pi Day TAS, he would most certainly have done it better than me. That being said, I wonder what bortreb would think if he saw this run.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
By the way, I forgot to mention one thing. I thought someone else would have noticed by now. VBA assumes 60fps when calculating its time, and outputs AVI at 60fps, so I will make the assumption that 60fps is correct behavior (even though this is supposed to be a wrong assumption; I'll get to it later). Thus, I made the TAS proper (as stated in VBA) to be 11649/11650 frames long (exact number depends on version of VBA), or 3m14.15s/3m14.17s. The movie length, as well as its encodes, report to 3m14s. (Well, except Youtube. It messed up somehow.) The site parser assumes a framerate for GBx/GBA TASes of about 59.7275fps. This is supposed to be the correct framerate, as Ilari says. Using 11649 for the frame count, TVA would report a time of 3m15.04s. Obviously I didn't want that. Address 0x0C of a VBM file is "number of frames". It is a redundant reference to number of frames that VBA writes in but never actually uses (it will always check the actual length of controller data to determine a VBM's true length). This reference is used by TVA to calculate the time, regardless of the VBM's true length. I discovered this when bortreb submitted the Total Control Hack run and the time was reported wrong. As you can see, the trickery is now obvious: change the "number of frames" address value to 11596. TVA then reports a time of 3m14.15s, as intended, and VBA acts like nothing ever changed. This isn't really a big problem or anything1; if necessary, I can easily change the TAS proper to 11596 frames, without losing anything (the TAS movie file ends on at least 5 seconds of no input just to get the framecount to 11649/11650), at the cost of VBA displaying the time I want. As a side note, GBx/GBA movies on this site display times that indicate inconsistent fps values. Newer ones are calculated with ~59.7275fps, older ones with 60fps. Ilari says that there is no easy way to fix this. ---- [1]: Ignoring the fact that this can be abused by dishonest submitters.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Link to video I didn't know that らるく⇔あんど⇔こっぺぱん is was0x. Edit: Apparently was0x changed username again. I don't get it.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
For those interested: A bad game done even faster (by 8 frames), and with BizHawk as well. The author says that the amount of lag was not changed from the previous. Link to video
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Anyway, I'll explain how I worked on this since a week ago. After finishing the H.E.R.O. submission, I decided to work on a "Pi Day" TAS, which I only had a week to work on. Initially, I thought about doing a TI-83 submission, but then decided not to pursue it, as apart from rattling off the first 10000 digits of pi and using curves to graph the shape of a pi, the idea didn't stick with me. Then I thought about Pokemon Yellow and what bortreb did. I already knew how to hijack the game; that work was done late last year. So I started on a program that would list 3141 digits of pi at about 31.4 fps (this takes 100 seconds, and is just enough to finish the movie in 3m14s) . I finished the initial stages of the program but then decided that merely listing digits of pi at 31.4 fps was too cheap, so I dropped that one. I thought that I might as well manipulate the VRAM to match the music. After all, if I'm going to do this, I might as well make it memorable. I decided that I would divide the screen into two parts, writing the digits of pi on the top, and having pi tiles dance on the bottom. Initially I wasn't sure of what format the input should be to interact with VRAM. I also considered different sizes of screen to draw on and how many distinct tiles to use. I decided on having the bottomspace be 8 rows by 16 columns, and using two distinct tiles, which are pi and pi upside down. This way I can input a tile on each frame. I used a "cache" to store the tile locations and dump later since otherwise there would be no way to sync them. I also allow for listing the digits of pi on the topspace, something that I wanted to do for a while. It took me a while to come up with a C++ program to help with entering the necessary input, and to script the whole thing, but I managed to do it. It only took 2 or so days anyway. Oh, and to answer jlun2's question: I wanted to make something memorable, not worry about emulators. I grew up using VBA so that's what I used. bortreb used VBA for Total Control Hack as well, so I know that it works. Anyway, thanks for the response and feedback. I didn't expect there to be so many replies.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
This post is supplementary material for this submission, although it is useful here as well. ---- Here's an analytical look at my TAS. It is known that program execution in Pokemon Yellow can be hijacked with nothing more than a 7-byte sequence with 13 zeroes proceeding it. A 7-byte sequence would be:
D368:
76        HALT
F0 F5     LDH A (FFF5)
22        LDI (HL) A
C3 5B D3  JP D35B

We'll get into how it works later. For the purposes of this TAS, the following 9-byte sequence takes less time to enter (and requires D350-D365 to be all 0):
D366:
22        LDI (HL) A
00        NOP
76        HALT
00        NOP
F0 F5     LDH A (FFF5)
D4 50 D3  CALL NC D350
Why? Well, go back to when the rival was named (space) (female) (PK) (END). Memory in D343 at that point is:
D343: 00 00 00 00 30 00 7F F5 E1 50 00
We want to change it to the 9-byte sequence somehow, so we do this: * Reset in the middle of saving. This overwrites D162 with FF and the game thinks you have 255 Pokemon. More importantly, you can now switch Pokemon below the 6th level. This will swap huge chunks of memory. * Switch any Pokemon 1-9 with the 10th Pokemon. This overwrites D31C with FF and the game thinks you have 255 items. * Switch the 17th and 20th Pokemon. Apart from other stuff going on, this will swap D322-D32C with D343-D34D. So now D322, which is close to the beginning of the item list, reads:
D322: 00 00 00 00 30 00 7F F5 E1 50 00
or from the beginning of the item list:
D31D: FF FF FF FF FF 00 00 00 00 30 00 7F F5 E1 50 00
None of the "items" cause problems when trying to toss them (some values crash the game, or are untossable). The addresses in the even spaces (D31E, D320, D322, ...) can all be reduced through tossing items, and 00 is treated as 0x100 so tossing one gives 0xFF. We now do this: * Toss D321 completely. This shifts it so it looks like this:
D31D: FF FF FF FF 00 00 00 30 00 7F F5 E1 50 00 00 00
* Toss 14 of D323. This changes 0x30 to 0x22. * Toss 9 of D325. This changes 0x7F to 0x76. * Toss 13 of D327. This changes 0xE1 to 0xD4. * Toss 45 of D329. This changes the 0x00 directly after 0x50 to 0xD3.
D31D: FF FF FF FF 00 00 00 22 00 76 F5 D4 50 D3 00 00
* Switch D32B and D329. This switches the last 00 00 with 50 D3. * Switch D329 and D327. This switches the same 00 00 with F5 D4.
D31D: FF FF FF FF 00 00 00 22 00 76 00 00 F5 D4 50 D3
* Toss 16 of D327. This switches the last 0x00 with 0xF0.
D31D: FF FF FF FF 00 00 00 22 00 76 00 F0 F5 D4 50 D3
Notice that we have our 9-byte sequence above starting from D324, but it needs to go to D366. So we do some Pokemon switches: * Switch the 19th and 17th Pokemon. This swaps D322-D32C with D338-D342. * Switch the 12th and 11th Pokemon. This swaps D322-D34D with D34E-D379 so now D338-D342 ends up at D364-D36E, exactly where we want it. Notice that the switching ensures that D350-D363 are all 0. Now close the menu. This is what happens: * At some point, the game reads D350 off of address D36E, which is supposed to hold a ROM address, and jumps to it. The value in register A is 0x50, and in HL is 0xD350, the location of the jump (note that the instruction 00 is NOP, which does nothing).
D350: 00 00 ... 00 22 00 76 00 F0 F5 D4 50 D3
The instruction LDI (HL),A (22) writes whatever is in A to the address pointed by HL. When it reaches HALT (76), it waits for the next frame.
D350: 50 00 00 ... 00 22 00 76 00 F0 F5 D4 50 D3
Now HALT runs a routine that puts key input into FFF5 as a number. The instruction LD A, (FFF5) (F0 F5) places this number into A. Then CALL D350 (D4 50 D3) jumps to D350 as a subroutine (in which we do not care about the "subroutine" part of it) and execution cycles again. Thus, by using LDI (HL), A over and over along with LD A (FFF5) to read input, we can write a program at D350. However, since D350 is executed every cycle, we must be careful. The program at D350 reads:
50        LD D B
which is harmless. We feed the input 0x18 and now it reads:
50        LD D B
18 00     JR 0
JR 0 means "jump relative by 0", which doesn't go anywhere. We feed the input 0x0F and now it reads:
50        LD D B
18 0F     JR D362
Notice the significance of the last instruction. It jumps 15 forward but still prior to the instruction LDI (HL),A at D366. That means that now we can input anything for the next 15 bytes and execution will ignore them. We now write:
50        LD D B
18 0F     JR there
16 98     LD D 0x98
21 6F D3  LD HL D36F
          input:
76        HALT
F0 F5     LDH A (FFF5)
22        LDI (HL) A
15        DEC D
CA 6F D3  JP Z D36F
18 F6     JR input
          there:
Feed the input 0x18:
50        LD D B
18 0F     JR there
16 98     LD D 0x98
21 6F D3  LD HL D36F
          input:
76        HALT
F0 F5     LDH A (FFF5)
22        LDI (HL) A
15        DEC D
CA 6F D3  JP Z D36F
18 F6     JR input
          there:
18 00     JR 0
Again, when jumping to the label "there", the instruction 18 00 does nothing because it is jump by 0. Now feed the input 0xEF:
50        LD D B
18 0F     JR there
          enter:
16 98     LD D 0x98
21 6F D3  LD HL D36F
          input:
76        HALT
F0 F5     LDH A (FFF5)
22        LDI (HL) A
15        DEC D
CA 6F D3  JP Z D36F
18 F6     JR input
          there:
18 EF     JR enter
Execution now jumps to "there", which then jumps to "enter", executing the program we set up. This is the stage 2 program, a simple RAM writer that writes 152 bytes to D36F and then executes it. It is left to the reader to verify this. Stage 3 is now constructed, and it is large. Here it is:
21308F    LD HL 8F30   //where to place data in Tile Data Table
01D2D3    LD BC data   //where 8x8 data is
1628      LD D 28      //size of 8x8 data
          loop:
0A        LD A,(BC)
22        LDI (HL),A
22        LDI (HL),A
03        INC BC
15        DEC D
20F9      JR NZ loop

2100D6    LD HL D600
3E10      LD A #10
          loop1.5:
22        LDI (HL),A    //clear mirror
CB44      BIT 0,H
28FB      JR Z loop1.5  //loop until D700		

1E00      LD E 00      // register DE is offset of BTM
          outerloop:

76        HALT
F0F5      LD A, FFF5 
FEEF      CP A,#EF
2869      JR Z exit
FEEE      CP A,#EE
282B      JR Z refresh
3016      JR NC numbers
4F        LD C A
CB61      BIT 4,C
2804      JR Z sprite1
3EF4      LD A #F4 //pirev
1802      JR skip

          sprite1:
3EF3      LD A #F3 //pi

          skip:
CBA1      RES 4,C
0600      LD B 0
2100D6    LD HL D600 //start of lower BTM mirror (starting from 9980)
09        ADD HL,BC
77        LD (HL),A
18DD      JR outerloop		

          numbers:
210298    LD HL 9802 //start of BTM+2
19        ADD HL,DE		
12        LD (HL),A  //write "Fx" number to BTM
13        INC DE
CB63      BIT 4,E
28D3      JR Z outerloop
7B        LD A E
C610      ADD A,#10
5F        LD E A
30CD      JR NC outerloop
14        INC D
18CA      JR outerloop

          refresh:
218299    LD HL 9982 //start of lower BTM
0100D6    LD BC D600
          loop2:		//loop for 256 bytes
0A        LD A,(BC)
22        LDI (HL),A
3E10      LD A #10
02        LD (BC),A	//clear mirror
03        INC BC
CB40      BIT 0,B
28F6      JR Z loop2  //that means B is still D6
18B8      JR outerloop		

          data:

FF 81 5B DB DB DB DB B9 //f3  pi
FF 3B B7 B7 B7 B7 B5 03 //f4  pirev
00 00 00 00 00 30 30 00 //f5  .
00 38 4C C6 C6 64 38 00 //f6  0
00 18 38 18 18 18 7E 00 //f7  1

          exit:
F3        DI   //disable interrupts, such as current music
218099    LD HL 9980
3EF3      LD A #F3 //pi
          loop3:
22        LDI (HL), A
CB54      BIT 2,H  //loop until 9C00
28FB      JR Z loop3:

          done:
18FE      JR done
It works as such: * First, it draws out the 8x8 tiles for pi, pi upside down ("pirev"), decimal point, 0, and 1. All other digits are already in the tileset. * Then, it takes input and changes the VRAM accordingly. Input is as follows: ** If input is from 0x00 to 0xED, the program draws to a cache which can later be dumped into VRAM at 9982. The drawing field is 8 rows by 16 columns. The input is considered as aaacbbbb, where aaa is the row, bbbb is the column, and c=0 for the pi tile and c=1 for the pirev tile. The choice of format is motivated by the fact that going down a row in VRAM is the same as adding 0x20=32 to the address. ** If input is 0xEE, the program dumps the cache into 9982, and then clears the cache using the black tile (value 0x10). ** If input is 0xEF, the program executes its ending sequence. ** If input is 0xF0-0xFF, the program writes directly to 9802, with the drawing field being 12 rows by 16 columns. The input's own number is written in as the value of the tile; all tiles of interest are in the Fx row. Tiles are written serially from left to right, then from top to bottom. Technically, the program can draw into the the bottom drawing field used by the first case of input above. * Its ending routine is a "fake crash" that disables interrupts, floods the bottom screen with pi tiles, then gets itself into an infinite loop (18 EF, or JR -2). And that's about it. There is no guarantee that VRAM writing occurs in a safe (to a real GB) manner; it does not check for status of FF40-FF41 (for reference, pages 51-53 of http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf ). ---- The C++ parser works as follows: * It recognizes the characters "0123456789abcdef|*s@." as well as uppercase variants. All other characters are delimiters. * If it first detects a character from "0123456789abcdef", then it expects immediately a second character from "01234567". This is for drawing to the cache representing VRAM at 9982. The first character represents the column, the second character the row. If it is immediately followed by '*', then it uses the pirev tile. Otherwise it uses the pi tile. * If it first detects the character '|', it counts to 15, inserting 0xED inputs along the way (the do-nothing-visible input), then inserts 0xEE (dump cache). It also resets the count to 1. * If it first detects the character '@', it counts to 8, inserting 0xED inputs along the way (the do-nothing-visible input), then inserts 0xEE (dump cache). * If it first detects 's', then it expects immediately a second character from ".0123456789". This is for drawing directly to VRAM at 9802. It uses the second character's corresponding tile. The parser does not insert the ending code (0xEF); it must be manually hex-edited. Also, the number of inputs between 0xEE (dump cache) commands should not exceed the counts to 15 or 8, whichever is appropriate. ---- Edit: Fixed pointer to data.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
ALAKTORN wrote:
I wonder why those little improvements like changing name and holding B weren’t found before?
Those "improvements" were already used in the previous run.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Rydian wrote:
See, TASvideos doesn't give a shit about development.
This statement is very misleading. BizHawk is living proof that TASVideos cares about development. See also BizHawk vs. FCEUX, BizHawk vs. lsnes vs. Snes9x, etc. (Even when restricted solely to "video-game development", I would avoid putting forth such a generalization.)
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
mklip2001 wrote:
It must have been really frustrating for real-time players to take the wrong routes and end up without enough dynamite to finish later stages.
If they only knew that shooting at those walls long enough would destroy them...
Radiant wrote:
What do you mean by "an ending of sorts", got a picture?
Like this: http://www.youtube.com/watch?v=ZGHDD_I3TPw&t=5m28s All it does is replace the score with ! marks, freeze the game, and do the Activision scroll. Pitfall is like that as well (except without ! marks). By the way, I'm not even sure that using death saves time, because of how long it takes to start again. Also, the graphics is a bit glitched so that the timer says "PIIWER" instead of "POWER". Whatever.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Please do not bump threads with vacuous statements. This thread isn't going anywhere useful soon, so I'm locking it.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I am aware of the bomb-wasting saving time off the tally but I decided against it. Bomb-wasting would lose a couple frames or so to plant it in the level itself, and I preferred not to let the end level tally affect the optimization of the level itself. So I ignored delays caused by tally screens. Most Sonic TASes do something similar.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
This game has something that remotely resembles an ending. That is something I like. The same can't be said for many other looping games. That being said, I never understood why game companies want to make their player character so slow. It's ridiculous. Interesting challenge this game is, with all the dodging, but, with how slow the player character is (slower than many other games criticized for being slow), I'll have to vote no for moon.