Booya! Damb, MP is one hellava beast, eh?
BIG PROPS TO TWITCH FOR GETTING AS FAR AS HE DID!!
Soo.. I've been messing around with Twitch's code today. Here is my code (some small additions / subtractions to his code):
http://www.mediafire.com/?r28jo7edl944ae4
And here is his most recent code for easy download (everyone say THANKYOU!):
http://www.mediafire.com/?b6nx6kwxk4j2gwyIn order to try it out you need the 39dll.dll in your spelunky folder:
http://www.mediafire.com/?3n3dp7vn39sj8k1Then make a exe. run two copys of the exe on your computer, set one to host the other join... voila! For my version to work, the host needs to start the level... usually several times for some reason. ??

Edit: here is the single computer MP by Keglunq, with his permission. Could be useful as it's currently the most functional out of everything, by far.
http://www.mediafire.com/?75tt2lihx12cda6So, lets start with how Tweak did:He had everything setup so that one player can host and the other join.
Each computer sends the location and sprite_index of it's player (oPlayer1) to an empty shell of a player (oPlayer2) on the other computer. This oPlayer2 contains no code for game elements, all it does is show where the other player is and what their doing (sprite wise).
When one player starts a level, the level is randomly generated using a shared 'seed'. ("random_set_seed(global.seed);" ) This way, the level that is generated for both players is identical.
Players can run around together on the same level, but that is it.
The stuff lacking is many. The enemies don't move in sync. The oPlayer2 doesn't react to anything (or visa-versa). For example, one player can't see the other players ropes or, If one player jumps on an enemy the other player will see that player fall though the enemy... stuff like that. Bombs can;t be used by oPlayer2.. ectect..
Now me!So, I tried my hand at fixing this. The way I did this was by first:
Making oPlayer2 be fully (mostly) operational again. Delete tweaks empty oPlayer2 and duplicate oPlayer1. Then remove a few things from oPlayer2, such as the online send receive stuff and the change level on animation end stuff.
Then I added a whole new set of control scripts for oPlayer2... check
2Left... check2JumpPressed.. ectect.
Added globals for player2 controls and send the keypresses from one computer to the other computers oPlayer2....
Now oPlayer2 will make ropes, jump on enemies and a few other things.
Problem is, still enemies are not in sync. Even after having computer1 wait for computer2 to start before starting. Whip still don't work (havn't tried to fix it yet).
Items still have trouble staying in the right hands and don't really fly in sync when thrown. oPlayer2 gets knocked out for some un-thought-of reason when jumping sometimes. oPlayer2 can get killed if he goes into a solid that is out of sync due to bombs.... ectectectect....

Yeah baby! This IS *FUN*! the pinnacle of *FUN*! That is rouge style 'fun' for anyone not knowing.
I donno if I will go any further with this.. Might be neat to try sending the location and sprite_index for ALL the enemies and items? Owell, it was a fun break from labyrinth. ;p