Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/nebupook/public_html/include.database.php on line 2
NebuPookins.net - NP-Complete - Everything you wanted to know about NNR but were afraid to ask
 

Deprecated: Function ereg_replace() is deprecated in /home/nebupook/public_html/include.parse.php on line 32

Deprecated: Function ereg_replace() is deprecated in /home/nebupook/public_html/include.parse.php on line 33
Everything you wanted to know about NNR but were afraid to ask
[Computer][Games]

I'm the guy who came up with NNR which, as far as I know, is the first site to let people upload their DDR scores other than Konami's own Internet Rankings that they used to run whenever a new mix of DDR came out, and probably one of the most popular back when it was still up (something like 2000-2004?) I've decided to actually document the events behind NNR, because my memory isn't so great, and I fear that these memories may one day be lost forever. The story is going to be presented in a biographical style, in chronological order, so if you actually have a question about NNR you want answered, you'll probably find the answers near the end of this post, rather than here at the top. The dates are going to be very vague, and might be very inaccurate. I really have a bad recollection of when everything happened. Also, I apologize in advance if this post sounds very boastful and self-agrandizing. It's just that I'm very proud of NNR, and rather sad that it had to die out the way it did.

My first exposure to DDR was seeing videos from the A-Team (They're a Korean freestyle group, and I can't believe their website is still up). This must have been sometime around 1998-1999. There was one video, I believe it was Lee Sung Jun and Kim Dong Wok performing "BRILLIANT2U/special edition" in which I thought the two guys looked almost exactly like Kilree (my best friend) and I. I interpreted this to be a message from God that Kilree and I should start playing DDR, even though when we saw these videos, we really had no idea what the rules of this game were.

A few months later, Kilree finds a homepad for PC (using the parallel port) and a emulator with a couple of songs (though we had no idea that what we had was something "unofficial"), set everything up on a computer, and started playing like mad. One of my favorite memories from this period was how, when we first saw Paranoia (the original one), we thought it was completely physically impossible for anyone to ever pass this song, and that was on Basic (we didn't even know there were difficulty levels back then).

A few months after that, a local arcade actually gets DDR. It was a 1.5th Mix machine. I played at the arcades a lot with my brother, but Kilree never really got into it as much as we did, so I eventually (drastically) left him behind. I eventually discovered, by watching the other kids play, that there were codes for stuff like "Hidden" and for increasing the difficulty. I ask about them, and learn them, and went to Trick and quickly to Maniac. Then I started freestyling in "Couple mode" with my brother, and dabbling a bit in Double mode. Soon I can clear every song on every difficulty, and have built up quite a large repetoire of routines with my brother.

Since then, the arcade upgraded to 2nd, 3rd, Korean 3rd, USA, 4th, 4th Plus, 5th, Max2 (skipping Max), and then Extreme. Then that arcade closes down, and the arcade next door upgrades their DDR Extreme to the unofficial DDR Megamix version. During the period in which we had 3rd, 4th, 5th and USA, I eventually became the "self-proclaimed best DDRer in Montreal". I could full combo every song (when I say every song, I mean every song, on Basic, Trick and Maniac, and on Single and Double; one 4th mix plus, that's a hell of a lot of songs. And I didn't just "assume" I could full combo the song on Basic just because I could do it on Maniac. I went ahead and did it, to make absolutely certain) (we didn't even know about Perfect Attack back then, so Full Combo was the "ultimate achievement"), and I had my name in every slot in every machine in Montreal, and even outside of Montreal. I'd leave my name at 1st place (on my 1st try) in a machine somewhere in Quebec, come back a year later, and see my name still there, undefeated.

Around the time of the end of 5th mix, this guy named Ced shows up, and starts beating my scores, and we have a back-and-forth battle for a while, but very soon, it becomes evident he's much better than me. Today, he regularly AA 10 footers, and AAA just about everything else. I only have one AAA under my belt: LTBHT on Extreme on Heavy.

Along the way, I collected DDR mixes for the playstation (but I don't have any mixes for the PS2, XBox, DreamCast or Gameboy) including all the numbered mixes, Extra Mix, Oha Station, Disney Rave, and the 2 "club mix" expansions to 2nd mix, as well as two Dancing Stages (True Kiss Destination and I forget the title of the other one). Something I really liked about the mainstream mixes was how it recorded your scores. I would go through every song, and try to get A on all of them (including doubles), then AA, and I would give up then (I only got a single AAA on a home mix, and it was Diving Money on basic on first try). I had wished that the arcade version had a similar tracking system.

Of course, it did. You could create a link savegame or whatever it was called, and then use it on the machine to store your scores. However, the slot at my arcade was kind of loose, and the memory card would frequently slip out, so that the results would not get saved. And then at one point, during some "upgrade", the slot just stopped working altogether.

At first, I used Excel spreadsheets to keep track of my score. I'd print out the sheets, bring them to the arcade, play songs, write down my scores, go home, type them in, print out a new batch, and so on. When I started learning PHP and MySQL, I made a simple site where I could submit my scores, and then wrote some scripts to produce statistics, like what my worst song was by percent DP, or by absolute DP and so on. It didn't have an account system, but rather that site was meant just to be used by me personally.

At one point, I posted a link to that site on the TGL forums in a topic where everyone was posting what their skill level was. I posted the link and said something along the lines of "Here's exactly what I am capable of on DDR". Something like five or seven people expressed interest in my "WebApp" and asked if I could make something similar for them. I was perfectly willing to give away all the PHP code (it only took like a few hours of coding anyway), but since they didn't know how to set up their own Apache/PHP/MySQL servers, it wouldn't have done them any good. So I decided to basically add the feature of "accounts" into this web app. I had to actually re-write the WebApp from scratch, because the original design wasn't meant to support accounts at all.

The URL for that WebApp at the time was http://nebupookins.no-ip.org/nnr/, where nnr stands for "Neb Neb Revolution". The name came from this mix I made for an emulator, which included brand new songs, backgrounds for them, and I even changed the announcer to be my voice (don't ask me to get the "NNR mix" of DDR, I've since then lost all the songs). I needed to name the WebApp something, and I didn't want to come up with a name right away, so I just named the directory "nnr" and figured I'd come up with a better name later. I had the five or seven original people who contacted me "beta test" NNR as I continued to fix bugs and add features (the stepcounts for more songs, for example).

For some reason, the URL was leaked in that somebody posted the URL onto the TGL forums or something, and then the user list quickly ballooned up to like 50 people or something like that. That was fine by me, as disk space wasn't really a problem, but because all of this was being hosted on my personal machine with an ADSL connection, people started complaining about how slow NNR was. Of course, my responce was "either donate a better connection to me, or deal with it" which everyone seemed to accept as a fair deal, but I could see that NNR seemed to be this "great idea" that was being seriously held back by my slow connection.

I asked JetGirl, the owner of TGL, if I could host NNR on her servers. I was already an Administrator (I think she and I were the only two Admins at the time, with everyone else being a moderator or a plain old user) meaning she had already placed a lot of trust in me, so she happily agreed. Once NNR got on TGL, the numbers rose again, to something like hundreds, maybe even a thousand.

There was one idea within NNR that I'm particularly proud of which I think contributed a lot to the growth of NNR: The signatures. I had learned enough about PHP to generate images on the fly, and so I wrote a little script that generated a small GIF button (maybe 200 by 40 pixels) that showed how many AAAs, AAs, As, and so on you had, what your overal average percent DP was, and stuff like that. Then I provided the HTML code saying "Copy and paste this into your bulletin board signatures", and it would produce a button which always had an accurate summary of all your DDR scores, and which, if you clicked on, would take you to your specific user profile page where yet more details could be seen.

In a blend of word-of-mouth advertising and viral marketting, soon everybody wanted one of those little buttons, and everyone was signing up for an NNR account. It also soon became evident that a lot of the new members weren't even members of TGL, but came from other DDR forums. I had considered somehow linking NNR to TGL, so that you needed to have a TGL account to use NNR, but I concluded there really didn't seem to be much point in that. TGL had a particularly good "friendly people" to "asshole" ratio, much better than any other DDR board I had seen, and I didn't want to attract a "bad crowd" to TGL. And besides, even if I did add the above requirement, people would probably just create accounts on TGL forums and never post. There was an "official NNR thread" on TGL, and that was the only thread I monitored about NNR. If they were talking about NNR on some other forums, I never knew about it.

At some point, a user named StinkyPoo22 started helping me code NNR. I'm guessing he probably approached me, 'cause I don't remember ever actually asking the public for help with NNR or anything like that. I probably quizzed him to check if he actually knew PHP and MySQL. I think he submitted a couple of algorithms in PHP for features, and I decided to make him an "official" part of the team.

Then, in 2003, I had to do a project for a university course. I decided to make the project "NNR2". NNR2 was a complete re-write of NNR from the ground up. I had become wiser with PHP, learning about stuff like SQL Query Injection, and better database design. The project would consist of two main components: The first is a program which converts the DB from the old NNR format to the new NNR2 format, and the second is the actual NNR2 WebApp. The biggest "technical feature" of NNR2 was to add sessions based logins. In NNR1, you had to re-enter your username and password every time you wanted to submit a score. With NNR2, you would log in once, and then you could submit as many scores as you wanted, without re-typing in your password. The most noticeable change in NNR2 was the look. It was designed to look like DDR Extreme (meaning a lot of green). From memory, NNR1 probably did not use any style elements at all, so you had tables that were most probably grey (or whatever the default color for tables are on your browser). The change that took the most work was redesigning the site to be user-centric, meaning that activities that are often done together would now show up on one page. For example, submitting scores and viewing scores are activities that are often done together, so in NNR2 they'll appear on the same page, even though they use very different PHP code. NNR1 was more "programmer-centric", meaning we laid out the code in whatever way was most convenient for us.

As part of the project, I had to write a report which you can download for free here. As an aside, while I am usually an advocate of Open Source Software, I chose not to make NNR open source. The reason is that NNR's advice system depends on many users submitting many scores, so that the software can get an idea of what songs are difficult and so on. If there were two NNR sites online, each of them having half as many users, the advice would be worst. Also, it made rankings more meaningful if there was only one universal ranking, instead of a ranking for every different site running NNR. Unfortunately, I now believe that NNR is dying if not dead, so I'm releasing the report I wrote for this project. I fully encourage anyone working on an "NNR-like" site to take advantage of the ideas I present in this document, especially the user-centric design (which I haven't seen any other sites adopt). There are also a few pointers in there about writing secure code, though the advice therein is probably obvious to most PHP developers. I can't release the source code because I don't actually have it anymore. Sorry.

When NNR2 was finished, I planned on running the update, but there were problems. My memory isn't too clear on this, but I think perhaps StinkyPoo had made some major structure changes to the DB, or perhaps added some features which he didn't want to have undone. And I also think he thought the new NNR2 design looked ugly. At any rate, all the code for NNR2 was thrown away and was not used except for the univeristy course. Instead, StinkyPoo and I worked on NNR1.5 and eventually NNR1.75.

Then, I got into my "crunch semester" in which I was really falling behind in my schoolwork. Being forced to choose between being kicked out of university and being forced to stop working on NNR, I chose to stop working on NNR. I told StinkyPoo that I would have to "disappear" as I take care of school work, and he was in charge of NNR until I was gone.

During this crunch semester, I started to not get along with TGL anymore. At one point, this guy, BigRed I think his name was, got banned from the IRC channel just because the Admins of the IRC channel didn't like him. He came to me telling this, and I found it hard to believe, so I started asking the IRC admins about this, and they were extremely defensive. It's like in those movies where the government denies everything and tells lies to covers their own ass. I was completely shocked at what I was witnessing. I thought TGL was one of the friendliest, fairest places on the Internet, and here it was full of backstabbing bureaucratic politics. At one point, I publically announced that I was going to resign as an Administrator from TGL, mainly due to the frustration I was having trying to get to the root of why exactly was BigRed banned from the IRC channel. I really was gonna do it, but this caused the other admins to start talking a bit more, so in the end, I stayed on as an Admin. The forums have a very clear and reasonable explanation of what actions will be punished with a ban. BigRed had commited none of these (in fact, he did absolutely nothing morally wrong). The official statement I got out of TGL was that the rules on IRC and the rules on the forum are different. And of course, the rules on IRC aren't written down anywhere, and may change at the whim of the admins. I explained the situation to BigRed and he accepted it, and he and I never ventured into the IRC channel again.

Later on, JetGirl created a hidden forum called TGL+, into which she invited all the "cool people" on TGL. I don't know if I was invited or not, because as an Admin, I can see all the forums. Obviously, I didn't approve of this idea, but JetGirl is my superior on TGL, so I couldn't really do anything about it. Later on, she created another forum (I forget the name, perhaps something like "Trash" or something), into which she invited all the people she didn't like. She justified it as a social experiment: Invite a bunch of people there, don't explain to them why they're there, and see how they react. Again, I didn't approve, but I didn't say anything (I did not, for example, go in and announce the purpose of this forum for all of its invitees to see). In the end, they figured out what it was for anyway. It just seemed like TGL was getting worse and worse, and while I never formally resigned from my post as an Administrator again, I went to the forums less and less.

When I finally came back to NNR, I sort of wanted to dive right into the project again. When I looked at the what StinkyPoo had done, I was not very pleased at all. He had actually removed code I put in for stability because he wanted to make the source look "more pretty". I forget the exact details, but it was something like code that made sure the "right thing" happens if you try to view a score category which had zero songs in it. StinkyPoo assumed that since we've got scores for both the DDR Extreme Single and DDR Extreme Double category, we'd never encounter this "zero song" situation, so he deleted the code. So when I tried to add in a DDR 4thMix Single category, which had zero songs, the whole thing stopped working.

There were other details, and with my typical abrassive personality, I pointed out everything wrong with the code, and he took it as personal attacks, and we got into disagreements. It became somewhat awkward working together. From his perspective, I was some guy who just came out of nowhere, starting shouting, and was "messing up" his code. Admittedly, a lot of the changes I tried to make ended up breaking NNR temporarily. I wanted to make drastic changes, like re-writing it to use a template system so that it could be easily reskinned. Or creating a Database class to handle all the MySQL queries. As I changed the old "procedural" code into object oriented code, a lot of stuff started breaking too. In the end, I think the contribution I made to NNR1.75 that survived was the mini-message board that was used to submit feature request and bug reports. The feature request thing was pretty neat, I though. People could submit feature requests, and then people could vote on what feature they wanted fixed first. Each feature was like a topic, so when you saw a feature name, you could click on it and then see a full discussion of that feature, such as details of what the user wanted exactly, and the developer's responces (e.g. "Okay, we'll do it" or "This feature is impossible to implement for the following reasons" etc).

One day, JetGirl says she's going to shutdown TGL in the next two months. She give specific details on why, but allude to something about billing issues. That meant I had to find a new host for NNR. The next week (i.e. not in two months), TGL shut down, and NNR just disappeared. Luckily, StinkyPoo was clever enough to have performed a full backup of everyone's scores when he heard about the shutdown news. But we still needed to find a host. A few other DDR sites offered to host NNR, but StinkyPoo said he'd pay for a host himself. He had proposed this idea before, and I told him I didn't like the idea, because I didn't want money to get involved into this project. If he spent money on NNR, he might claim that he now "owns" NNR. While I didn't want to offend him by implying he'd do something as nefarious as that, I did want to make it clear that bringing money into this will make things very complicated. However at this point, it seemed like we didn't really have much choice, so I let StinkyPoo pay for a server to host NNR.

The server then promptly shut down NNR. When SP sent an e-mail inquiring about what happened, the hosting company said NNR was consuming way too much processing power, and that was against the terms of the agreement. We made emergency fixes to NNR by removing all the rankings and all the signatures. Then, I wrote a "cached ranking" script. Once a day, StinkyPoo would manually run a script that would update all the rankings on NNR. That meant that now, if you submitted enough scores to move up a rank, you wouldn't see the change until the next day. A lot of people were unhappy about the idea, and we got a lot of feature requests like "Please make rankings non-cached" and we'd explain why they were cached once, and then every time someone submitted that feature again, we'd give them a link to the original discussion in which we deny that feature.

I had an idea about "always updated rankings" which was simply this: People view the rankings all the time, but only rarely actually submit a score. So instead of manually running the cache-updater once a day, just run it whenever someone submits a score. That's the pseudocode, but I don't think Stinky ever actually implemented it. In the end, even with cached rankings, NNR got shut down again, for using too much CPU time.

Poo then went from host to host, trying to find one that would be willing to host NNR, with mixed success. I think this is the main reason NNR kept going offline every now and then.

The relationship between StinkyPoo and I continued to erode. Eventually, what we settled on, so that we could both be out of each other's hair, was that I would make a seperate site, NNR3, where I could implement all my experimental changes. StinkyPoo would be allowed to perform bug fixes on NNR1.75, but NOT add features, or else we'd essentially be having two competing versions of NNR being produced. But even these negotiations eventually broke down.

Overall, it seemed that the popular opinion was that people like StinkyPoo's ideas better than mine, and SP was paying for all the hosting charges, so sometime around 2004, I finally decided to official transfer all the rights of NNR to StinkyPoo. It was a very emotional time for both of us, so I wasn't "clear-headed" enough to write up a formal contract. I basically just said "Given that you've contributed more NNR than I have, both in time and money. It's yours. Do what you want with it." I suppose he's not legally obligated to do anything for me anymore, but morally, he probably has to continue putting my name in the credits and stuff like that. I think he's a good guy, so I don't think he'll screw me over that way.

Since then, I've had virtually zero contact with StinkyPoo, and from what I hear, no one has really had any contact with him. NNR continues to go up and down, and most of the time these days it's down. Sometimes people track me down via e-mail or AIM or something, and ask me about NNR, and I always tell them the same thing: I have nothing to do with NNR anymore, and I can't even help you get in contact with StinkyPoo, because I don't know where he is either. Administrators from other Bemani sites have even come to me, saying they want to host NNR, and I tell them I don't have the scores from the database, nor the PHP code anymore. Seriously, I wish NNR was up just as much as anyone else, but there truly is not a thing I can do about it.

I've learned that since then, there have been two NNR-clones built. One of them is DDRecall and the other is Over The Monkey. I just found out about them today (which made me want to write this post), so I don't know anything about them or their founders. I'd love to meet them though, if only to see what they're like.

Download the NNR2 Project Requirements Document [PDF]

 
Deprecated: Function ereg_replace() is deprecated in /home/nebupook/public_html/include.parse.php on line 60

Deprecated: Function ereg_replace() is deprecated in /home/nebupook/public_html/include.parse.php on line 61
E-mail this story to a friend.

You must be logged in to post comments.