Saturday, October 31, 2015

This has always annoyed me

I can't speak for Windows 8 or 10, the more cancerous releases of Windows, but this definitely applies to all versions of Windows that support USB up to and including Windows 7.

When you get a new USB device and plug it in, get it installed, and use it for a while, it feels like everything's perfect.  But then, one day, you move your computer and have to unplug and re-plug everything.  Suddenly, it's installing all your USB devices again.  What the...

Yeah.  Windows installs USB devices per USB port, which makes no fucking sense.  So basically, every time you get a new USB device, to eliminate headache later, you have to unplug absofuckinglutely everything, and then plug the new device into every USB port, one by one.  With some devices, you'll also need to reconfigure them per port, which is even more retarded.

Why is it that whatever identifier Windows keeps for the USB device itself includes an identifier for the port it's plugged into?  It would be so much more intuitive if it didn't...

Thursday, October 22, 2015

Ridge Racer 3D StreetPass Duel Duplication

Edit (2015-12-29): It doesn't have to be this complex.  There's a far simpler method, which I've detailed in a new post.

As mentioned in my previous post, I have discovered a method to duplicate StreetPass duels in Ridge Racer 3D.  In order to do it, you may need an SD card reader, depending on which model of 3DS you have.  It requires a kind of lengthy setup, and as suggested by the previous sentence, involves messing around with data on your SD card, so it's probably not for everyone.

DISCLAIMER: Since these directions involve messing with the extra data on your 3DS' SD card, take extra special care to make sure you're not accidentally doing something silly like deleting data for another game or anything like that.  When followed verbatim, these directions work without adverse side effects.  I'm not responsible for anything that may happen if you don't follow these directions properly.
  1. After getting a Ridge Racer 3D StreetPass, fire up Ridge Racer 3D.
  2. Go to Single Player → StreetPass Duel, just like usual.
  3. Accept your 2000 points per StreetPass.  If a duel is saved to extra data here (there will be a progress bar between the two "Saving..." dialogs), you can proceed past this step.
  4. Once the duel is saved to extra data and you're sitting there looking at the list of duels, press HOME and exit the game.
  5. (Old 3DS) Turn off your 3DS, remove the SD card, and insert into your SD card reader (which is hopefully attached to your computer).
    (New 3DS) Go to System Settings → Data Management → microSD Management, and get it connected to the network (i.e. if you haven't already set it up, do so now).
  6. Browse to one of the following paths, depending on your console's region: (for the New 3DS, go into the microSD directory first)
    NA: Nintendo 3DS\<console-specific hash>\<console-specific hash>\extdata\00000000\00000358\00000000
    EU: Nintendo 3DS\<console-specific hash>\<console-specific hash>\extdata\00000000\0000033B\00000000
    JP: Nintendo 3DS\<console-specific hash>\<console-specific hash>\extdata\00000000\00000328\00000000
  7. Copy the files there to a new directory in the root of the SD card.  See the part of the paths in the previous step that's different per region?  I personally recommend putting that number in the name of the directory you're creating.
  8. (Old 3DS) Remove the SD card from your SD card reader, put it back in your 3DS, and turn the system back on.
    (New 3DS) Completely exit System Settings.
  9. Fire up Ridge Racer 3D again.
  10. Beat the duel.  The game will then delete it from extra data, unless of course you hit a duel win milestone and get extra bonus points, in which case, beat the duel again so that the game will delete it from the extra data.
To restore the duel, just copy the data you backed up back to the place where you originally found it, making sure to overwrite when prompted.  The next time you start the game and go into StreetPass Duel, the duel will be there and you can get its points again.  If you're wondering, the numbers that differ per region in the path to the game's extra data are a part of the game's Title ID, which I found here.

Wednesday, October 21, 2015

Ridge Racer 3D StreetPass Bonus Points Duplication

You know those 2000 points you get per Ridge Racer 3D StreetPass, regardless of whether the StreetPass actually contains a duel for you to race against?  Well, you can get that reward multiple times with the same set of StreetPasses.  Here's how.
  1. After getting some Ridge Racer 3D StreetPasses, start up the game.
  2. Go to Single Player and select StreetPass Duel, collect your rewards points.
  3. Once the duel menu loads, press the power button and turn off your 3DS.  It's important that you don't go into any other menu before doing this.  Don't even select a duel to race against.
  4. Turn your 3DS back on and start the game again.
  5. Go into StreetPass Duel, and you'll get the rewards points again.
  6. Lather, rinse, repeat from step 3.
If you'd like to check your points while doing this, then you need to have something unpurchased in the garage.  Immediately upon starting up the game, go to the garage and select anything that you haven't purchased, and you'll see how many points you have.  Once you go into StreetPass Duel and get the points, don't press anything other than the power button.

How did I discover this?  Well, I actually discovered it while attempting to duplicate the duel data itself, which was also a success.  That process is a bit more involved and requires copying data around on your SD card, so I figured I'd get the simpler, more quickly repeatable one up here first.  Stay tuned for duel duplication, though!

Edit (2015-10-26): After doing some homepassing and duplication of the full complement of 16000 points, I think I have a good understanding of what's going on here.  Basically, when the game checks your StreetPasses, and gives you the bonus points, it hasn't yet removed those StreetPasses from its queue, but it leaves you at a point where it's safe to power off your 3DS.  You can verify this by going to Notifications after power-cycling your 3DS.  You'll see that your Ridge Racer 3D StreetPasses are still there.

Double Edit (2015-10-26): It looks like this is a bug in the game that's specific to the StreetPass Duel menu.  I just tried to use the Grand Prix menu to do the duplication, since it will check the StreetPasses, and also tells you how many points you have, both before and after the StreetPass bonus points get applied.  However, the StreetPasses are gone from Notifications after using the Grand Prix menu to get the points, so it won't work there.

Sunday, October 18, 2015

SmileBASIC Tutorial: The Touchscreen

This tutorial, as well as any and all of my future tutorials, assume that you understand basic programming concepts such as variables, keywords, control structures, branching, etc.  If you don't understand these things, there's actually a primer in the digital manual for SmileBASIC.  Just select it on your 3DS' home menu and tap the Manual button.  I'm mainly going to focus on accomplishing specific tasks, which will be supplemented with simple programs.  The task of putting all of this knowledge together and making a game out of it will be left as an exercise for the reader.

SmileBASIC also has a complete reference to all of its built-in keywords and functions.  Just start typing something.  See the keywords and so forth that appear in the green boxes at the top of the touchscreen?  Tap one of them, then tap the question mark on the right.  Instant reference for anything in the language, and it's super helpful.

That said, let's begin.

The touchscreen is pretty simple to read from in SmileBASIC.  Consider this line of code.


TOUCH is the meat and potatoes of this instruction.  There's actually another parameter that can go between TOUCH and OUT that specifies the "Terminal ID", this is for writing programs that make use of the 3DS' wifi card.  Wireless connectivity is outside the scope of this tutorial, so let's move on.  OUT directs the output to the three variables provided.  The first one, TIME, is the amount of time that the touchscreen has been touched.  If this is zero, the user is not touching the touchscreen.  X and Y are the coordinates of the touch.  The origin (0, 0) is the top left corner of the screen.  However, SmileBASIC won't return a touch in the outermost five pixels of the touchscreen on each side, so the range you have to work with is 5..314 for X, and 5..234 for Y.

To actually get started, you'll need to set the screen mode using the XSCREEN instruction.  SmileBASIC defaults to XSCREEN 0, which allows the top screen to use stereoscopic 3D effects, but doesn't use the bottom screen.  The bottom screen will continue to be the on-screen keyboard.  XSCREEN 1 disables stereoscopic 3D on the top screen, but also doesn't use the touchscreen.  To actually use the touchscreen, you'll want XSCREEN 2, XSCREEN 3, or XSCREEN 4XSCREEN 4 is a bit weird for tutorial purposes, and you probably won't want to mess around with the stereoscopic 3D just as you're learning to work with the touchscreen, so the one you'll want is XSCREEN 3XSCREEN has other arguments, that deal with sprites and background images, but they're optional, so let's keep it simple and not pass values to them for now.

However, before that, you don't really know with 100% certainty what state the screens are in.  You could have been messing around in DIRECT mode just running instructions, or a previous program could have left stuff there.  You'll want to return to a nice known state, and this is made very easy with the ACLS instruction.  Inspect the help on it to see exactly what it does, because it does a lot of stuff.  The important thing to know is that after the ACLS instruction, the displays and graphics pages will always be in a known state, so it can only help to begin your program with it.  Since it explicitly sets some things that you may want to override for the purposes of your own program, make sure it's the first line of code and all your changes happen after it.

Like any other form of reading input, you'll want to read from the touchscreen in a loop.  It's fair to assume that you'll also be reading button input in this loop, as you get on to bigger and better projects.  Consider this sample code.


That code should give you an idea of what your game loop might look like in its most basic form.  We read button input so that our loop can check to see if the Y button is among those being pressed, and if it is, the loop will exit.

Now, let's actually output some stuff, so you can see what you're reading from the touchscreen.  This is a rather simple application of LOCATE, the FORMAT$() function, the PRINT statement, and the VSYNC instruction.  Behold, our modified sample code.


The VSYNC instruction is important, because it waits for the rest of the screen to be drawn before letting execution continue.  The argument, in this case, 1, speciifies the number of frames to wait.  Since we want to grab input on every frame, we specify 1.  Specifying 1 is actually optional, but I like to do it.  It's handy at times to update the screen multiple times per frame, perhaps to draw several things at once, but in this case all we're doing is outputting text, so it's pointless to output more than once per frame.

From there, the sky's your limit.  I turned it into a program that allowed drawing on the touchscreen, using the d-pad to change sliders for the RGB value of the color, so that drawing in different colors could happen.  If you'd like to check it out, the public key is B5EXV23E.

Tuesday, October 13, 2015

Tips...

I see so many people stating, suggesting, or implying that tipping is required in places that have tipped employees (i.e. restaurants).

Federal law, however, says otherwise (italics added by me).
If the employee’s tips combined with the employer’s direct wages of at least $2.13 per hour do not equal the federal minimum hourly wage, the employer must make up the difference.
Link for reference: http://www.dol.gov/dol/topic/wages/wagestips.htm

So I don't want to hear about it anymore.  A tip always has been and always will continue to be a reward for exemplary service.  It will never be an unwritten 20% tax.  Doing your job correctly earns you your wage.  Going above and beyond earns you a tip.  If you don't think restaurants pay their waitstaff enough, you can always try to get the minimum wage raised.  That would be the correct thing to do.  Trying to shame people for not adding 20% to their restaurant bill is the incorrect thing to do.

Now, usually I get service worthy of a tip because I'm typically in a large group that comes in close to the restaurant's closing time and they have to deal with us when they'd rather wind down and leave, so this is a non-issue.  At the same time, I have a problem with paying people extra for doing the job that they're already being paid a set, agreed-upon rate to do in the first place.  I feel like it makes sense, after all, for the exact same service at the exact same level of quality, would you rather pay more or less?

Thursday, October 8, 2015

So I Tried the Monster Hunter 4 Ultimate Demo...

I tried it because I wanted to try a game on my New 3DS that uses the C-Stick.  Now, I know, it's a smash-stick in Smash Bros, but it's awkward to use at best.  With that in mind, I downloaded the demo to Monster Hunter 4 Ultimate, which also uses the C-Stick.

The C-Stick works quite well to control the camera, once you investigate the options and invert the Y axis.  The only problem is, other than its equivalent on the touchscreen, it's the ONLY way to control the camera other than pressing L to center it behind your character.  I mean, the D-Pad also controls the camera, but that's stupid because it's on the same side of the console as the movement controls.  The camera also doesn't follow you properly, like in any other third-person game.

So most of my experience was spent trying to get the camera to point in the correct direction.  At the very beginning, the demo does an information dump and expects you to remember all of it.  It also says "oh hey if you forget any of this you can always look at it again later in the menu".  So, I hit Start when I wanted to remember something, and THE GAME DOESN'T EVEN PAUSE WHEN YOU BRING UP THE MENU.  You have to select the "Pause" option in the menu to actually pause the damn game.  What kind of horse shit is that?  Also, it's one of those games that uses Select to do the exact same thing as Start.  Good job, guys.

So I'm on the lowest difficulty with all the things turned on to tell me where to go because I've never played anything in this series before, and I'm supposed to be hunting down some dinosaur-like thing, which apparently has a 25 minute time limit or I fail.  Time limits are hardly ever a good thing.  After beating on the dinosaur thing for a while it runs away and I have to run after it.  Except that most of the fight is spent going "okay aim at the damn thing" "okay it knocked me over" "where did it go" "oh there it is" "why is my bow's aiming mode ever off" "why do the aiming controls suck" "oh great it just ran away again".

As far as I'm concerned, Monster Hunter 4 Ultimate is one of those games where its difficulty is based around its broken controls.  It takes what otherwise looks like it might be a fun game and makes it shit.

The controls can be adjusted, somewhat, in the options.  There's a button for "target the stupid thing I'm trying to fucking kill", but all it does is make pressing L to rotate the camera put a targeting reticle on the screen briefly.  Your character doesn't rotate to match where the enemy is, not even with a bow where you'd actually WANT that.

After I fail the mission, because there's no hit confirmation or health bar for the enemy, so I don't know how much progress I'm actually making, and just figuring out how to maneuver myself around the environment is cryptic at times so I end up having to run across multiple areas to find the damn thing again and then surprise I'm out of time, it asks some questions.  One is reasonable, because it's the demo and it's asking me if I want to exit the game and start the eShop.  HAHAHAHAHAHAHANO.  I'll leave your shit controls that can only be made moderately better through the options where they are, to fester and rot in the darkest corners of the eShop.  The second question is absurd.  I just failed the mission on Beginner, the lowest difficulty level, and it's asking me if I want to change difficulty levels.  Unless there's one called "Sane", where the game's controls suddenly don't suck and the camera follows suit, I'm going to have to say no to that as well.

The only credit that I'll give is to the demo for not having a restricted number of uses like all other demos that I can find.  Some demos have as few as 5 uses, and you're somehow supposed to have enough gameplay time to decide if the full game is worth your money with those.  Because, you know, you're going to have to exit the demo eventually, to handle StreetPasses or play other games.  Yeah, other games.  It's a game console with more than one game, you know?  I'd like to be able to go back into a demo whenever I please to try something different.  Besides, the limiting factor on a demo should be the amount of content, not the amount of playing the game the player can do before being locked out of it for the rest of eternity.

Maybe that's what I'll do here.  Maybe, through a fluke, or some stroke of luck, I'll find a combination of the options that makes the game's controls and camera not suck.  I don't have high hopes for that, to be honest.  Also, if you're trying to play this on an Old 3DS and you don't have a Circle Pad Pro, it's got to be even worse control-wise.