Jump to content


  • Content count

  • Joined

  • Last visited

  • Days Won


evandixon last won the day on July 25

evandixon had the most liked content!

Community Reputation

594 Excellent

About evandixon

  • Rank
    Mystery Dungeon Researcher
  • Birthday 08/02/1995


  • Gender

Recent Profile Visitors

58,693 profile views
  1. Yeah, it's important to use a decrypted ROM. Encrypted ones aren't supported, and because of legal concerns, I have no plans to add support. I believe I've fixed the issue in the latest version. Please try again with this one. I don't know for sure if it will resolve the crash, but the latest build did fix a crucial bug, and I think it's worth a try. Alternatively, the version Wol38 linked to may work.
  2. Thanks for the suggestion! Our forum software doesn't support this out of the box, but we do have the ability to put sidebars in the forums. I've put them in place to show who the local moderators for forums are: We can put anything else in the sidebars we want, so suggestions for additional uses are welcome.
  3. The Background I'm a professional developer using mainly C#. On the side, I write a ROM editor using VB.Net. They're very similar thanks to them mostly wrapping the .Net Framework, and because of how complex this application is, I'm in no hurry to rewrite it. This application knows the ins and outs of a few dozen file types and can, well, edit them. One such file type is a compiled LUA script. In order to edit these, they must first be decompiled. Rather than try to figure out that myself, I use a 3rd party tool that can do that for me (sometimes the best code is the code you didn't have to write). To use it, I point it to the compiled script on disk, and it spits out the decompiled text into its standard output. Integrating with it is simple thanks to .Net: I can use a Process object to start it, redirect its standard output, and read the decompiled text as it's written. This is all part of a larger process, where transparent to the user, I decompile a bunch of these scripts, automatically make some changes, and recompile them, all in one go, so people can play a game using different characters. A few days ago, I did some refactoring to it so I can more easily get notified of unsuccessful exit codes when recompiling (previously the program would just continue fine, and any files with syntax errors would simply remain unmodified). Unfortunately for me, I was in a hurry and didn't test anything except that program before I pushed the change to the master branch and let my CI server publish a development build, currently the only way for people to get precompiled versions of my application. (The CI server is Team City, since they've generously given me unlimited everything with my open source license.) Also I don't have any tests covering this part of the code. The Problem One of my application's users encountered some (well, dozens) of exceptions when my program tried to recompile the decompiled scripts. I try reproducing the issue, and I indeed find a syntax error in the same spot the newly-created error message said it was. After looking closer, I found the issue was there before the decompiled scripts were automatically modified. The script looked something like this: function addTheNumbers(numberA, numberB) function addTheNumbers(numberA, numberB) return numberA + numberB return numberA + numberB end end print(addTheNumbers(10, 20)) print(addTheNumbers(10, 20)) It should be fairly obvious what the problem here is. The lines are doubled. I facepalm on the inside and start investigating. The Adventure Because the code I changed is being called about a dozen times on different threads, I did the responsible thing and wrote a test for it. After getting my test to fail for the right reason, I look at my code, and here's what I see: That looks like pretty standard stuff. The variables "captureConsoleOutput" and "captureConsoleError" are both true, telling the Process to redirect standard output and standard error, and the code will proceed to register event handlers. When I place breakpoints on the event handlers, I find that they're being hit twice per line the LUA decompiler writes. I scour the code and make sure that I only call Start once, and the event handlers are only added once as shown. I tried a bunch of other things too. What you see above is actually after another thing I tried. Previously, I was dumping standard output and error into the same StringBuilder , in case the program was outputting to both for some reason. I finally went to GitHub to check what actually changed when I did the thing mentioned in The Background above, and while it was a substantial change to the class shown above, it all seems pretty sane. But then I spot it. One crucial thing that didn't change. Oh. The event handler was registered twice. I added lines 39 and 40 (the two AddHandler lines) and forgot completely about the Handles clause. How Events Work And Why It Took Me So Long To Spot This Events are magical things that can be called, and event handlers that have been registered to the event are run, being given the data that was provided when the event was called. This isn't so much like method calls as it is interrupts. The syntax for adding an event handler in C# looks like this: myEvent += myEventHandlerMethod; And the syntax for adding an event handler in VB.Net looks like this: AddHandler myEvent, AddressOf myEventHandlerMethod Usually C# and VB.Net are very similar thanks to the .Net Framework, but sometimes there are some differences, where one language can do a thing that the other cannot. There are some gotchas when it comes to events, so they need to be used with care. .Net is a framework that tries its best to clean up after you and prevent memory leaks. Simply remove all references to an object, and .Net makes it go away. But when you register an event handler to an event in another class, that event handler has a reference to the event, and by extension the class. If you get rid of the references to that class, the reference to the event is still there, and .Net can't clean it up. But you also can no longer remove the event handler since the reference to the class is gone. That's why it's important to remove event handlers as you would pointers in C/C++. The syntax for removing an event in C# looks like this: myEvent -= myEventHandlerMethod; And the syntax for removing an event in VB.Net looks like this: RemoveHandler myEvent, AddressOf myEventHandlerMethod To help make managing this easier, VB.Net has some extra syntax. Instead of manually adding event handlers, you can declare a variable as WithEvents, then use the Handles clause on a method, like so: Private WithEvents _myMemberVariable As SomeRandomClassWithEvents Private Sub _myMemberVariable_OnPropertyChanged(sender as Object, e as PropertyChangedEventArgs) Handles _myMemberVariable.PropertyChanged 'Do the thing End Sub With no additional setup, when I assign something to _myMemberVariable, _myMemberVariable_OnPropertyChanged will automatically be run whenever _myMemberVariable.PropertyChanged is raised. If I change _myMemberVariable to some other SomeRandomClassWithEvents, it'll take care of removing the old handlers and adding the new ones for me. And setting _myMemberVariable to Nothing (aka null) will clean it up for me. I've been using C# a lot more lately, I've had to start doing events the old fashioned, no hand-holding way. I've been doing it for long enough now that I forgot to even check for the Handles clause when all evidence pointed to an event handler being registered twice. VB.Net is a fine language, and IMO it's easier to read and easier to type (not having to constantly type '{' and ':' when simply pressing enter works instead). However, it no longer has language parity with C#, meaning C# will continue to evolve, and VB.Net won't grow with it. The future is C#, and it's sad to see VB.Net be left behind. Guess I'll have to get around to rewriting this thing for it to be part of the future.
  4. Thanks for the report. I've found the issue, but it'll take a few days to make the fix. In the mean time, you can try the previous version: https://teamcity.projectpokemon.org/repository/download/SkyEditor_SkyEditorROMEditor_B/30743:id/SkyEditor.ROMEditor.UI.WPF Build 125.zip You'll need to recreate the starter project, since all of the lua scripts it uses behind the scenes are broken beyond repair and need to be recreated. Nothing substantial. I'm always tweaking things, adding minor features, fixing bugs, or in the case of build 132, introducing new bugs. I haven't done it in a while, but I try to update the Sky Editor blog whenever there's any new notable feature.
  5. evandixon

    GTI Hacking Adventures

    Pictures showing GTI hacks
  6. Sounds like Lua isn't compiling the scripts properly. I've pushed an update to Sky Editor that should capture these so we can learn more: https://teamcity.projectpokemon.org/repository/download/SkyEditor_SkyEditorROMEditor_B/31506:id/SkyEditor.ROMEditor.4.1.0-CI132.nupkg Try rebuilding the solution, and check the Errors dialog to see if anything's listed. If so, please send me the details. Unfortunately, the dialog still doesn't scroll, but you can use Control+C to copy the text.
  7. Looks like you don't have Java installed.
  8. Normally when there's references in the modpack like that, the projects would show up in the solution. Are there any errors listed in the errors tab?
  9. For the most part yes, like starters, scripts, and Pokemon portraits, but there's some things that are either only applicable to one or have only been researched on one. Additional reading about what can be done can be found here. Maybe not in Sky Editor, but @psy_commando's GfxCrunch should work.
  10. To ensure the best experience for the most of our members, we have limits on the amount of data that can be uploaded on the site. We do not wish to prevent the publication of relevant content, so if you have a need for a higher limit, create a thread here, and we can give you a higher limit, free of charge. Group Attachment Size Total Limit New Member (Less than 50 posts) 512 MB 1 GB Member (50 or more posts) 512 MB 2 GB Colored Usernames (awarded with certain badges) 512 MB 5 GB Patron 512 MB 10 GB Staff Unlimited Unlimited These limits are subject to change. If you have any questions or concerns, feel free to let us know in our feedback forums, either publicly or privately.
  11. You're right! This should make things go faster. DEMO_01 is run right after the Nintendo Logo, and DEMO_02 is run shortly after the screenshot, right at the start of the theme music.
  12. Following the success of his fan dub of Pokémon Super Mystery Dungeon, YouTuber TheGoldCrow has started a new project: a fan dub of Pokémon Mystery Dungeon: Explorers of Sky. One interesting feature of his dub of Super Mystery Dungeon is that some episodes end with custom scenes consisting of fan-written dialogue that fits quite well with the existing story. His dub of Explorers of Sky is no different. However, unlike the dub of Super Mystery Dungeon, the custom scenes in the dub of Explorers of Sky were created using ROM editing tools made in collaboration with @Nerketur, @psy_commando, and myself. You can watch the fan dub here, or if you would prefer to skip to the custom scene, it can be found at the end of the second episode. More episodes will be posted, so either check back later or subscribe if you are interested in watching more. How the custom scenes work @Nerketur pioneered the research into editing the scripts and wrote one of the first ROM editing tools for Mystery Dungeon out there, @psy_commando wrote the specific tool I used: statsutil. While this is an amazing tool, dealing directly with command-line applications can be a hassle, so I prefer using my own program Sky Editor to manage its execution for me. I've written a tutorial on how to use it, which can be found here: When following it, make your way to the third step titled "Creating a Modpack", and when you get to the "Making Mods" heading, more information about using statsutil can be found here (and when you're done, resume from where you left off in the Sky Editor guide): For this project, I chose to overwrite the scene that normally takes place after reaching the end of Beach Cave for the first time (right before the battle with Koffing and Zubat), because it is easy to get to: I just had to create a quick save one tile away from the stairs, after which will trigger the new scene. From there, TheGoldCrow used video editing to stitch it together with the rest of the video. For anyone looking to make a ROM hack, a slightly better alternative would be to insert the custom script at the end of an existing script, although the method I used could still be used for quick testing. View full article
  13. The password to the Pokesav zip files is: Project Pokemon I suspect the problem you're encountering may be a leading or trailing space when copy/pasting the password, so take care that there are no leading or trailing spaces, while not leaving out the one space in the middle. Also the password is case-sensitive and the capitals matter. There are some specific things Pokesav can edit that PKHeX cannot (as spacerotom mentioned), but for everything else you are absolutely correct.
  14. Unfortunately, Sky Editor's UI is made with WPF, which is dependent on Windows libraries and hard to port to Linux, hence Mono not supporting it. I'm also unable to find any way to get it working with Wine. Going forward I'm trying to make as much as possible cross-platform, but so much of Sky Editor uses WPF that the UI will remain Windows-only for the foreseeable future.
  15. I don't know why it happened, but luckily it was a simple fix. Our tutorials live in the tutorials section, and the threads you see in the forums are generated from them. Any edits made to the tutorials apply to the forum threads, so because we were lucky enough to have the images in the tutorials work fine, re-syncing the threads fixed the issue. Thanks for reporting the issue!