If someone is interested, I am working on an Animation Editor for RSDK (compatible from Sonic CD to Sonic Mania): https://github.com/Xeeynamo/RSDK
Oh dang, this is excellent. Makes things much easier to edit sprites and the like. Replacing Sonic with Metal ought to be a snap with this Great job Xee, can't wait! I assume this is also capable of re-mapping a sprite sheet, yes? Any idea how the .bin files handle multiple sheets?
It is really easy, it works like Sonic CD/1/2: An animation data file defines what textures are imported on its loading, then for each frame you can specify what texture will be associated with that file. About re-mapping it is possible but it is painful as hell. I am planning two buttons to import and export single frames into a texture altas, populating automatically every animation. The only trouble that I am getting is about maintaining the palette order.
Much to my surprise, passing over the coin does end the stage. I was expecting to just walk right over it. Grabbing the coin by loading the stage from the dev menu doesn't add it to your save. I haven't tested it in an actual save file though, I have a feeling it might actually add to your save then. I can't confirm that yet.
Tried to compile this with Visual Studio Community 2015 Update 3, and got this error from the compiler: Code (Text): C:\Users\techo\Documents\GitHub\RSDK\AnimationEditor\MainWindow.xaml(179,26): error MC3074: The tag 'NumericUpDown' does not exist in XML namespace 'clr-namespace:Xe.Tools.Wpf.Controls;assembly=Xe.Tools.Wpf'. Line 179 Position 26.
Thanks to soneek and Neo for the list of loop points! Here is a batch file to automatically tag the ogg files with LOOP_START. This is using the names as given by rdskv5_extract, and requires Tag.exe. Spoiler Code (Text): @echo off tag BlueSpheres.ogg -t LOOP_START=407077 tag BlueSpheresSPD.ogg -t LOOP_START=5309957 tag BossEggman1.ogg -t LOOP_START=282240 tag BossEggman2.ogg -t LOOP_START=264600 tag BossFinal.ogg -t LOOP_START=302400 tag BossHBH.ogg -t LOOP_START=70560 tag BossMini.ogg -t LOOP_START=276105 tag BossPuyo.ogg -t LOOP_START=846720 tag ChemicalPlant1.ogg -t LOOP_START=680400 tag ChemicalPlant2.ogg -t LOOP_START=680400 tag Competition.ogg -t LOOP_START=94500 tag EggReverie.ogg -t LOOP_START=176400 tag EggReveriePinch.ogg -t LOOP_START=226800 tag FlyingBattery1.ogg -t LOOP_START=158760 tag FlyingBattery2.ogg -t LOOP_START=70560 tag GreenHill1.ogg -t LOOP_START=776160 tag GreenHill2.ogg -t LOOP_START=775552 tag HBHMischief.ogg -t LOOP_START=381405 tag Hydrocity1.ogg -t LOOP_START=1 tag Hydrocity2.ogg -t LOOP_START=329797 tag Invincible.ogg -t LOOP_START=139623 tag LavaReef1.ogg -t LOOP_START=497329 tag LavaReef2.ogg -t LOOP_START=769745 tag MainMenu.ogg -t LOOP_START=202752 tag MetallicMadness1.ogg -t LOOP_START=470400 tag MetallicMadness2.ogg -t LOOP_START=296056 tag MetalSonic.ogg -t LOOP_START=151200 tag MirageSaloon1.ogg -t LOOP_START=48510 tag MirageSaloon1K.ogg -t LOOP_START=1007820 tag MirageSaloon2.ogg -t LOOP_START=179390 tag OilOcean1.ogg -t LOOP_START=358389 tag OilOcean2.ogg -t LOOP_START=176400 tag PulpSolstice1.ogg -t LOOP_START=318316 tag PulpSolstice2.ogg -t LOOP_START=226625 tag Results.ogg -t LOOP_START=88991 tag RubyPresence.ogg -t LOOP_START=198457 tag SaveSelect.ogg -t LOOP_START=131290 tag Sneakers.ogg -t LOOP_START=120960 tag StardustSpeedway1.ogg -t LOOP_START=432894 tag StardustSpeedway2.ogg -t LOOP_START=1 tag Studiopolis1.ogg -t LOOP_START=1146600 tag Studiopolis2.ogg -t LOOP_START=311142 tag Super.ogg -t LOOP_START=165375 tag TitanicMonarch1.ogg -t LOOP_START=184069 tag TitanicMonarch2.ogg -t LOOP_START=384873 tag UFOSpecial.ogg -t LOOP_START=288655 ren *.ogg *.logg
I don't know who the fuck did this, but it's so fucking hilarious. http://www.youtube.com/watch?v=MuFudbSSPgA Regarding the dev Menu, does the Studiopolis zone present under the Media Demo menu differ from the final version? A quick check confirms that the sewer exit (from which the player gets out in the zone transition) is absent in the demo level. I wonder if there is any other difference! Studiopolis song had changed during development (you can compare the first footage with the final version, the song is the same, but there are several tune ups). Maybe the demo level tries to load an older version of the song not present in the final build.
Actually yes, it's def an older map. It's the one from the show demos that has the end of act sign with the rings floating above it.
So hey guys I did a thing 25% Scale 100% scale *LARGE IMAGE WARNING* I'll post my notes on what I have regarding the level format tomorrow as it's late and I'm very tired but honestly it really isn't much so far. Basic level map rips are the barest of bare minimums but hey, it's a start.
The NumericUpDown depends to Xe.Tools.Wpf. Have you tried to compile it first? Plus I am using VS2017 15.3.3 and it compiles with success. EDIT: Download link: https://github.com/Xeeynamo/RSDK/releases
Would imagine remapping would be a good bit of a pain. Your solution sounds good, especially considering people would have to re-arrange pretty much everything to begin with to have sprites fit together correctly in some instances; honestly if you're making a new player character, you might as well do that. Regarding palette order, by that do you mean forcing the order of the colors in the .gif to the game palette, if it isn't ordered already? Like if someone makes a sprite with an unorganized palette, but all the colors are correct, you want the sprite's palette to reorganize itself on import? I feel like you can leave that on the backburner for *now* and just inform your users to make sure every image they import has the same palette, as that's ideally what they should be doing anyway. It's really their responsibility to keep track of that, and both Gimp and Photoshop have easy ways of forcing an image to order their colors correctly--for photoshop what I usually do is just have a master image with the proper palette, and paste the sprite I made into that image. Works like a charm. Still, accessibility is nice, and not everyone has access to PS and Gimp's method is probably more annoying, so.. obviously look into that for the future. I'd imagine all you'd need to do is maybe do a hex code lookup for every color in the .gif's index, compare them to the "master palette" of the sprite sheet, and then store in memory what the current index of each color is VS. what they should be as noted in the master palette. Then make it that any pixel that's indexed incorrectly is changed to the proper index #, and finally set all those indexed colors to the correct color hex code in the sprite's local palette. Of course this is probably what you're *trying* to do and the real issue is dealing executing it / with the .gif format, which I can understand if thats the case :specialed: i don't know how to deal with image formats/libraries at all. But theory-wise that's how I'd do it, probably saving a temp .gif as well so as to not mess with any source files and probably make things more stable
Code (Text): 1>------ Build started: Project: Xe.Tools.Wpf, Configuration: Debug Any CPU ------ 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Utility.cs(45,41,45,49): error CS1026: ) expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Utility.cs(45,49,45,50): error CS1002: ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(52,17,52,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Utility.cs(45,49,45,50): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(52,17,52,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleInputDialog.xaml.cs(51,17,51,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleInputDialog.xaml.cs(51,17,51,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleInputDialog.xaml.cs(53,10,53,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleInputDialog.xaml.cs(56,17,56,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleInputDialog.xaml.cs(56,17,56,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleInputDialog.xaml.cs(58,10,58,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(54,10,54,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(57,17,57,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(57,17,57,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(59,10,59,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(62,17,62,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(62,17,62,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Dialogs\SingleSelectionDialog.xaml.cs(64,10,64,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(78,17,78,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(78,17,78,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(80,10,80,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(83,17,83,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(83,17,83,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(85,10,85,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(88,17,88,19): error CS1043: { or ; expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(88,17,88,19): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(90,10,90,10): error CS1513: } expected 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(157,39,157,42): error CS1525: Invalid expression term 'int' 1>C:\Users\techo\Documents\GitHub\RSDK\Xe.Tools.Wpf\Controls\NumericUpDown.xaml.cs(157,43,157,48): error CS1003: Syntax error, ',' expected ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Soooo... I gotta get a newer Visual Studio it looks like? -_-; EDIT: ahahahaha what the fuck VS, it wants to install everything to my C: drive instead of my massive D: or F: drives I'll just stick to VS2015 (the tools I got from Nintendo rely on that version anyway) and grab binaries
Awesome! Great stuff, a start it is indeed. Considering what's been done in less than a week, I can't see it being long before full custom levels are possible.
Those level maps will come in very useful for learning where all the rings are, nice work! Hax is coming along very quickly and in a wide variety of ways, Sonic running backwards being chased by the UFO cracked me up =P
Hi, I just joined the forum and wanted to share my findings and tools so far. First of all rsdkv5_extract, which was mentioned here, which can unpack and pack files to rsdk. For the next files, I descrbied the structure of them with python construct library. (which allows me to parse and rebuild them, very convenient) So the first file is Meshes .bin. I created mdl2stl. Which converts mdl 3d models to stl. (the description of the file structure is in the script) I am really not sure about what I called "Normal", but since it seems that verticies can have this property, I guessed that this is it. But I can't even dump it per vexel with STL. ALL the models have this information (HasNormals on) And for the colors, some of the models have embedded colors. I am not sure how to extract them, because they seems to be per vertex, but in binary STL format I can only encode them per face (which is the logical thing to do). And there isn't even one file with what I called "MaybeHasTextureCoordinates" on. It should be simple to write a tool that does the other way (stl2mdl), but it may be an issue because of the colors (for the models that have them)... The next files that I researched are GameConfig.bin and StageConfig.bin. The structures are in parse_game_config.py and parse_stage_config.py. StageConfig.bin is mostly subset of GameConfig.bin. Here is an example of GameConfig.bin parsed and of StageConfig.bin One of the interesting things in those files is the palette of course. From what I gathered, there are 8 palettes. In each palette there are 256 colors, which are splitted to 16 columns. If a column of pixels isn't defined in StageConfig.bin, it will be taken from GameConfig.bin. I wrote a palette editor with an option to import and export the palette (to ACT and PAL formats, Photoshop and GIMP support them) (better not look on the code of that one.. I did something quick). There are also downloads of packaged windows binaries for some of those tools. also from GameConfig.bin, I extracted the list of all the scenes: https://pastebin.com/cYd4mDM5 If you want to run a specific scene, you can enter a scene directly from the command line: Code (Text): SonicMania.exe "stage=GHZ;scene=1;" you can also make the game open a console with some prints: Code (Text): SonicMania.exe "stage=GHZ;scene=1;console=true;"
The Sonic heads as the blue spheres is a nice touch. When can I download a version of Mania where everything is replaced with Sonic
Forget Sonic, we need to meme it up. Everything replaced with Knuckles. The game already gave us a head start on that