Posts for CX_gamer

Post subject: Flash games
Experienced Forum User
Joined: 1/3/2010
Posts: 16
Some guy on reddit asked about TAS'ing a Flash game. In the past I have tried scripts which wait on specific pixels, but that isn't a real TAS since its frames are not at exact times. You could go the simulation road by creating a wrapper which swaps out RAM for a program that runs the Flash container. But there might be a cleaner solution. It is possible to decompile .swf files and be able to edit them. Afterwards some code for TAS tools can be copied in and perfect frame-by-frame inputs will work nicely. Maybe this can even be applied as a patch. I don't know how savestates would work though, so that may be a point of discussion. The advantage of this method is that it would open up Flash games for perfect TAS'es. What do you guys think? Would it even work?
Experienced Forum User
Joined: 1/3/2010
Posts: 16
3D pinbal: space cadet would be the official name. :P
Experienced Forum User
Joined: 1/3/2010
Posts: 16
ZeXr0 wrote:
scrimpeh wrote:
sticktendo wrote:
Man, if this could work, I'd love to see some more PC game TASes.Can anyone say "I Wanna Be the Guy?"
IWBTG has the same problems as Kaizohacks. Near perfect play is required to even progress, so any TASing wouldn't be significantly faster than an otherwise perfect non-speedrun and rather dull.
I think the level of play required to merely progress in IWBTG is a lot further from perfection than that. And what little TASing I've done of it so far suggests that there are plenty of little unintended timesavers (things you're unlikely to see outside of a TAS because of how risky they are). Plus, there's enough going on in IWBTG that most viewers probably wouldn't find a quick movie of it dull.
No I don't think IWBTG would be a dull TAS, there are indeed many things one could do for entertainment. And many parts that could be optimized far beyond human possibilities.
subanark wrote:
I would vote for simply allowing a bot that controls the input (and can decide when to input the keys) to be acceptable as part of the run. Such bot might be limited to having to input the exact same sequence each time, but simply decides when to input the next key (based on memory analysis). This would be subjective, and would require a level of technical skill from the TASer, but I'm sure in most cases someone can justify why their better run is in fact better.
I have actually made something like this. But not by memory watching, but by watching the screen. Basically it holds a certain key to move, until a pixel turns a certain color, on which it hops to the next step. It was quite a long-dreaded script, but it could easily be written to a input-file, compressing all required data for the script. I managed to clear a few screens using this technique, I haven't had it desync once. You can see it on youtube.com/cxgamer, sorry I can't link to the video, as my school network blocks it (no proxies, no vm's either). Though obviously I wouldn't vote this being allowed, as this can't be a long-term solution. I wish I had the programming skills to contribute to this awesome project, I'm learning as fast as I can. :P
Experienced Forum User
Joined: 1/3/2010
Posts: 16
It wasn't that much entertaining to me. Though that may not be your fault. TAS's tend to go too fast for explaining each trick, like the fast pole climbing wasn't even mentioned. I would like to hear more details about it. However I like to hear the things such as that you can go to that place in mario kart, or that the 2nd boss fight is the only one that has lava. Maybe you could add more on developpment of the run?
Post subject: Re: Interesting DOS NetHack random seeds list
Experienced Forum User
Joined: 1/3/2010
Posts: 16
dwangoAC wrote:
I offered to volunteer some CPU time to brute-force seeds
If more brute-forcing is required, maybe I could help? I'm offering CPU time on an intel i7, liquid-cooled and 6 Gb RAM. Though I don't really know much about emulating DOS and thus would require help on teamviewer. But I would love to help. :)
Experienced Forum User
Joined: 1/3/2010
Posts: 16
I don't know how entertaining the fastest playthrough would really be.
Experienced Forum User
Joined: 1/3/2010
Posts: 16
I've read that the RNG is affected by the time passed since january 1st 1970, so should a tas start at that time? Also, if the RNG is so hard to manipulate, you should consider a brute-force script to test all possible solutions for a given outcome. I have a above-average rig, so if you guys ever need to run some complex calculations, don't be afraid to ask. :) And I agree with you, realTime would be the way to go. :) I'm going to download this game to check it out. Or at least try.
Experienced Forum User
Joined: 1/3/2010
Posts: 16
Hi, can anyone explain what stuffed bones are, and why they won't be allowed, please? Thank you. EDIT:
Whether using the contents of a deceased player's bones is ethical is left to the player to decide. Bones can often make a difficult game much easier by providing items that the current player has not "earned" yet. Finding one's own bones is an even more difficult position. Luckily on a public server there are enough players that this is unlikely to happen too frequently.
EDIT2: This one is clearer;
Bones stuffing consists of playing a game for the express purpose of gathering useful items (up to and including a full ascension kit) and then deliberately committing suicide with the intention of leaving a bones pile for another character to exploit in some pre-designed manner. Sometimes the practice is taken to such extremes that the true identities of randomized items are engraved on the floor to aid subsequent characters. Bones stuffing is not considered bug exploitation and technically speaking is within the rules of the game, but most regard it as violating the spirit of the game. For example, a pacifist character who ascends using an ascension kit obtained via bones stuffing would not generally be considered to have ascended legitimately. It is important to observe that under normal circumstances, encountering and exploiting bones piles is a legitimate action, even in borderline cases such as bones piles containing full ascension kits. The difference is that bones stuffing involves deliberate suicide of a character, whereas a normal bones pile is a result of an honest (albeit failed) attempt to survive. Bones stuffing on a multi-user system is risky, as it is possible that another player will get the benefit of your bones pile.
Experienced Forum User
Joined: 1/3/2010
Posts: 16
Whoa the last 6 pages of this thread turned into a drama series! :D Now where's my popcorn... Great work guys, I'm following up your work closely.
Experienced Forum User
Joined: 1/3/2010
Posts: 16
I once did a part of a game with macro's, it used pixel-color detection against desync. It's more like a lot of checkpoints than a frame-perfect sync. But it worked smoothly. :)
Experienced Forum User
Joined: 1/3/2010
Posts: 16
upthorn wrote:
I Wanna Be The Guy
I tried that.. Well not a real tas, but a script.. It uses pixel-color detection to know where the guy is at each given time. I made this video as proof that it's possible, however it would take a lot of work; which it's not worth to me.. http://www.youtube.com/watch?v=G98KqfYVqP4 The code for this simple vid was:
program IWBTG;
const
  frm = 20;
  chk = 10;
  dbg = true;
  
procedure pressKey(id : Integer);
begin
  KeyDown(id);
  wait(frm);
  KeyUp(id);
end;

procedure waitUntilColor(x, y, color : Integer);
begin
  status('Scanning');
  repeat
    wait(chk);
  until (getColor(x, y) = color);
  status('Waiting');
end;

function GetCurrentTime : String;
var
  t, h, m, s : Integer;
begin
  t := getTimeRunning();
  h := t / 3600000;
  m := t / 60000 - h * 60;
  s := t / 1000 - m * 60;
  t := t - s * 1000;
  Result := '(' + IntToStr(h) + ':' + IntToStr(m) + ':' + IntToStr(s) + ',' +
            IntToStr(t) + ') ';
end;

procedure report(text : String);
begin
  AddToReport(GetCurrentTime + text);
  writeln('---');
end;

procedure debug(text : String);
begin
  if dbg then
    writeln(GetCurrentTime + text);
end;

procedure walkTo(x, y, id : Integer);
begin
  status('Scanning');
  KeyDown(id);
  waitUntilColor(x, y, 8);
  KeyUp(id);
  status('Waiting');
end;

procedure setup;
begin
  disguise('IWBTG Completer - By CX');
  clearDebug();
  clearReport();
  ChangeReportWidth(300);
  activateClient();
end;

procedure menu;
begin
  report('Navigating menu');
  pressKey(113);
  debug('F2 - New game');
  waitUntilColor(593, 422, 12437049);
  pressKey(16);
  debug('Shift - Skip Intro');
  waitUntilColor(526, 166, 65931);
  pressKey(16);
  debug('Shift - Start');
  waitUntilColor(416, 475, 9868950);
  pressKey(39);
  debug('Right - Second save');
  waitUntilColor(393, 477, 10066329);
  pressKey(16);
  wait(frm);
  debug('Shift - Select save');
  waitUntilColor(355, 209, 26294);
  pressKey(40);
  debug('Down - New Game');
  waitUntilColor(332, 240, 16777215);
  pressKey(39);
  debug('Right - Very Hard');
  waitUntilColor(443, 258, 6731519);
  pressKey(39);
  debug('Right - Impossible');
  waitUntilColor(389, 265, 11993014);
  pressKey(16);
  debug('Shift - Select');
end;

procedure part1;
begin
  report('Started gameplay');
  debug('Wait - touching ground');
  waitUntilColor(168, 89, 8);
  KeyDown(39);
  KeyDown(16);
  debug('Jump right - upper path');
  wait(300);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - upper path');
  report('Cherry valley');
  wait(200);
  KeyUp(16);
  waitUntilColor(240, 570, 8);
  KeyUp(39);
  debug('Wait - falling cherry');
  wait(260);              // tw
  debug('Right');
  walkTo(357, 570, 39);
  wait(frm);
  debug('Left - falling cherries');
  walkTo(333, 570, 37);
  debug('Wait - falling cherries');
  wait(200);          // tw
  debug('Right');
  walkTo(466, 570, 39);
  debug('Wait - falling cherries');
  wait(240);          // tw
  debug('Right');
  walkTo(670, 570, 39);
  wait(frm);
  KeyDown(37);
  debug('Left - falling cherry');
  wait(2 * frm);
  KeyUp(37);
  debug('Wait - falling cherry');
  wait(200);          // tw
  wait(frm);
  KeyDown(39);
  KeyDown(16);
  debug('Jump right - onto steps');
  waitUntilColor(750, 506, 8);
  KeyUp(39);
  keyUp(16);
  debug('Left - positioning for jump');
  walkTo(732, 506, 37);
  KeyDown(16);
  debug('Jump - try to get cherry');
  waitUntilColor(734, 400, 8);
  KeyUp(16);
  KeyDown(39);
  debug('Right - lure cherry');
  wait(frm);
  KeyUp(39);
  KeyDown(16);
  debug('Double jump wait - levitating cherry');
  wait(200);          // tw
  KeyDown(39);
  debug('Right - on 1st platform');
  waitUntilColor(733, 354, 8);
  KeyUp(16);
  KeyUp(39);
  wait(frm);
  waitUntilColor(739, 379, 1973790);
  KeyDown(37);
  KeyDown(16);
  debug('Jump left - on 2nd platform');
  wait(frm);
  KeyUp(16);
  waitUntilColor(660, 346, 8);
  KeyUp(37);
  debug('Wait - cherry');
  wait(140);           // tw
  KeyDown(37);
  KeyDown(16);
  debug('Jump left - on 3rd platform');
  wait(frm);
  KeyUp(16);
  waitUntilColor(545, 313, 8);
  KeyUp(37);
  wait(frm);
  KeyDown(37);
  KeyDown(16);
  wait(600);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - on 5th platform (skipping 4th)');
  waitUntilColor(325, 314, 8);
  KeyUp(16);
  waitUntilColor(292, 313, 8);
  KeyDown(16);
  debug('Jump - final ledge');
  wait(600);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump');
  waitUntilColor(70, 378, 8);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Jump - cloud screen');
  wait(400);
  KeyUp(16);
  report('Cloud room');
  waitUntilColor(766, 314, 8);
  wait(280);
  KeyDown(16);
  debug('Jump - 1st cloud');
  wait(200);
  KeyUp(16);
  waitUntilColor(593, 320, 8);
  KeyDown(16);
  debug('Jump - 2nd cloud');
  wait(400);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - 2nd cloud');
  wait(200);
  KeyUp(16);
  wait(600);
  KeyUp(37);
  wait(200);
  KeyDown(37);
  wait(50);
  KeyDown(16);
  debug('Jump left - 3rd cloud');
  wait(500);         // tw
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - 3rd cloud');
  wait(350);           // tw
  KeyUp(16);
  KeyUp(37);
  debug('Wait - hammer time');
  waitUntilColor(265, 265, 8);
  KeyDown(39);
  debug('Right - falling off');
  wait(120);
  KeyUp(39);
  wait(frm);
  KeyDown(37);
  debug('Left - 4th cloud');
  wait(520);
  KeyDown(16);
  debug('Double jump - 4th cloud');
  wait(200);
  KeyUp(16);
  wait(800);
  KeyUp(37);
  KeyDown(16);
  debug('Jump - ledge');
  wait(400);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - ledge');
  wait(350);
  KeyUp(16);
  KeyDown(39);
  debug('Right - ledge');
  wait(60);              // tw
  KeyUp(39);
  waitUntilColor(70, 250, 8);
  KeyDown(37);
  KeyDown(16);
  debug('Jump left - safety');
  wait(400);
  KeyUp(16);
  report('Invisible block room');
  waitUntilColor(745, 218, 8);
  KeyDown(16);
  debug('Jump - 1st block');
  wait(600);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - 1nd block');
  wait(200);
  KeyUp(16);
  waitUntilColor(515, 250, 8);
  KeyDown(16);
  debug('Jump - 2nd block');
  wait(600);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - 2nd block');
  wait(400);
  KeyUp(16);
  waitUntilColor(290, 250, 8);
  KeyDown(16);
  debug('Jump - ledge');
  wait(600);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - ledge');
  wait(400);
  KeyUp(16);
  wait(1000);
  report('Above the city');
  waitUntilColor(640, 250, 8);
  KeyDown(16);
  debug('Jump - 1st block');
  wait(200);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - 1st block');
  wait(50);
  KeyUp(16);
  waitUntilColor(482, 282, 8);
  KeyDown(16);
  debug('Jump - 2nd block');
  wait(600);
  KeyUp(16);
  waitUntilColor(355, 282, 8);
  KeyDown(16);
  debug('Jump - 3rd block');
  wait(500);
  KeyUp(16);
  waitUntilColor(255, 218, 8);
  KeyDown(16);
  debug('Jump - 4rd block');
  wait(200);
  KeyUp(16);
  waitUntilColor(166, 186, 8);
  KeyDown(16);
  debug('Jump - 5rd block');
  wait(400);
  KeyUp(16);
  waitUntilColor(80, 121, 8);
  KeyUp(37);
  wait(frm);
  KeyDown(39);
  waitUntilColor(90, 122, 8);
  KeyDown(16);
  debug('Jump - 6th block');
  wait(600);
  KeyUp(16);
  //waitUntilColor(180, 56, 8);        // This needs to be fixed
  wait(100);                           // and this be removed
  KeyDown(16);
  debug('Jump - game over room');
  wait(400);
  KeyUp(16);
  report('Game over room');
  wait(frm);
  KeyDown(16);
  debug('Double jump - game over room');
  wait(400);
  KeyUp(16);
  waitUntilColor(336, 540, 9422847);
  KeyDown(16);
  debug('Jump - item grab');
  wait(500);
  KeyUp(16);
  waitUntilColor(4, 287, 3300019);
  report('Invisible block room');
  waitUntilColor(91, 249, 8);
  KeyDown(16);
  debug('Jump - 1st block');
  wait(600);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - 1st block');
  wait(200);
  KeyUp(16);
  waitUntilColor(318, 249, 8);
  KeyDown(16);
  debug('Jump - 2nd block');
  wait(600);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - 2nd block');
  wait(400);
  KeyUp(16);
  waitUntilColor(543, 249, 8);
  KeyDown(16);
  debug('Jump - ledge');
  wait(620);
  KeyUp(16);
  wait(frm);
  KeyDown(16);
  debug('Double jump - ledge');
  wait(600);
  KeyUp(16);
  //waitUntilColor(542, 249, 8);

end;

begin
  setup;
  menu;
  //pressKey(82);
  part1;
end.
Experienced Forum User
Joined: 1/3/2010
Posts: 16
That's amazing! :o
Experienced Forum User
Joined: 1/3/2010
Posts: 16
OMG I would LOVE to see a rayman tas! :D However it used to freeze my computer more than 10 years ago. :D
Experienced Forum User
Joined: 1/3/2010
Posts: 16
There was a level in Yoshi's island, (something with morph) that I could hardly complete as a kid. :D I've played I Wanna Be The Guy on Very Hard, nothing seems hard to me anymore. :P
Experienced Forum User
Joined: 1/3/2010
Posts: 16
I tool assisted... Also check the leaders boards of humanbenchmark ;)
Experienced Forum User
Joined: 1/3/2010
Posts: 16
Skipping introduction...
Comicalflop wrote:
There's two other problems I encountered, with Portal specifically. One, the game runs at 300 frames per second. (Was it 300? I forget, but something really high like that.) Portal's camera works like this: where your mouse is pointing, you turn and look. This would, using frame advance only, create the most spastic camera work ever, with 300 crazy camera movements per second. Because during framestep you can't hold down the button, you can't create smooth movement, and the end movie would most likely cause anyone to throw up from motion sickness. Like this.
When standing still (so the direction of movement doesn't matter), could a script be made to move the mouse between two points when waiting for the gun to reload?