Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Sept 7, 2022 9:36:18 GMT -8
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Nov 13, 2021 14:18:24 GMT -8
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Nov 13, 2021 0:27:24 GMT -8
OK so I've revised my ASL (auto splitter) script and it now allows for: automatic starting, splitting, resetting, extracting in-game time and detecting saving/loading sequences (to subtract from the real time and to get so called "loadless" time). It's available here: github.com/tomalla5120x/gruntz-autosplitterBefore we start recording the speedruns however, we need to set up some ground rules. Here are my propositions: - for now only single level runs are allowed (the loadless timer in my script doesn't support runs spanning multiple levels yet)
- no video splicing (what if the game crashes? Should people be allowed to resume from the most recent saved game state? What about the real/loadless time then? How often are these crashes anyways?)
- in case of a 100% (PERFECT) run you have to include the stats page at the end of the video to verify that the PERFECT score has been in fact achieved
- using the auto splitter is not required but highly recommended, as it also allows to not only start and split automatically but also to track the in-game time and loadless time. If you don't use the auto splitter, the speedrun real time is calculated as a difference in time between the following frames in the video: the first frame where the exclamation bubble pops up signifying the presence of player's Gruntz teleporting in (or the first frame where the white circle under player's cursor appears), and the first frame after bringing the warpstone to the King where the ending level animations start (Gruntz flexing and exiting).
- if you don't use the auto splitter to show the exact in-game time but use the in-game time from the stats page screen instead, the in-game time recorded will have all "9"s filled in after the period. That's because of the way the stats page works - if it shows the time "0:35" it may be any time from 0:35.000 to 0:35.999. Treating it as 0:35.000 is unfair to the runs which have the exact in-game supplied. That's why we assume the worst time possible.
- if the actual speedrun is not at the beginning of the video give us the approximate time mark where it starts.
- the video must include a loading screen for the level that would signify what level it is and that it's not a cheeky custom level. It may be either the initial loading screen at the start of the level or the loading screen when you quickload during the level.
- easy mode is forbidden
- recording game audio is mandatory. It allows for (easier) verification whether the video has been sped up and/or spliced.
- runs may try to minimize the in-game time alone and thus pause the game extensively. Upon submission just tell us explicitly that it's this kind of a run as it will be marked appropriately.
In any other circumstances pausing the game is prohibited.
Other organizational notes: I don't think the secret level should be allowed to speedrun. It's mostly just the "typing game" requiring the player to input cheat codes as quickly as possible. I don't feel like it's the speed running material. (Edit:) Never mind, didn't really realize you may not use cheat codes to complete the secret level.- training levels can be speedrun but only in the
100% Any% category and not the Any% 100% category. The reason is simple: the training levels 1, 3 and 4 are impossible to complete without 100% and the training level 2 can be completed without 100% but it doesn't gain any benefit to the player whatsoever (skipping the second shovel requires choosing a different route of the same length).
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Oct 30, 2021 0:42:33 GMT -8
For some reason the attachment in the original post containing the image got deleted. Fortunately I had the original image on my drive so I've reuploaded the attachment. Hopefully it'll stay longer this time
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Oct 23, 2021 5:27:29 GMT -8
It looks like the hosting server already allows HTTPS requests so it's all just a matter of fixing the download links which use HTTP protocol.
I've quickly whipped up a Proboards Plugin which finds all http : // gooroosgruntz.info/custom/<levelname>.wwd links and transforms them dynamically on document load into https : // gooroosgruntz.info/custom/<levelname>.wwd equivalents. The download links now seem to work and we don't have to meticulously go through hundreds of links.
Thanks for the report!
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Oct 19, 2021 7:33:28 GMT -8
If the project goes well, speedrunners will want to search this forum for details they need. I think we should prepare some threads serving these information. What I mean is, for example, a list of known glitches (I haven't even heard of that spring routing error you mentioned) and exploits/special behaviors (crossing diagonally a pair of pyramidz). Unless there are such lists already... Then you may as well link them in the game description/rules at speedrun.com. Of course! Allegedly Claw community got a nice influx of newcomers when they requested Claw at speedrun.com. I hope for the same here! At some point we could start a board here on the forums dedicated to speedrunning. For now I'm still researching the subject - polishing my toolbox (OBS profile, LiveSplit layouts, AutoSplitter script ...) and writing down all of my observations like tips and tricks. For now I'm storing it all on my blog here temporarily: datashenanigans.pl/gruntz-speedrunning-tips-tricks/ but once we finishing everything we would ideally move all this info here on the forum. A list of banned glitches should also be incorporated somewhere. I'll update that blog page with that list as well. By the way if you want to know more about super springs glitch, here's more info: gooroosgruntz.proboards.com/thread/923/super-springz Full playthroughs of games sometimes divide their timings into two categories: real time and time without loads. How about giving it a try? Could you provide some examples of such games for reference? I want to see how they organized such classifications. Bonus points if they have an autosplitter! About the game timer... Well, the only way I see is testing out all the possibilities in a small, testing level (like, a 30x30 square with a Warpstone Grunt and a fort a few steps away). One could record a video and try to measure amounts of seconds/frames (in a program capable of it) instead of repeatedly mashing stopwatch buttons every so often. I think it should be prioritized, because it's a question I'd quickly ask if I were a speedrunner trying to get familiar with Gruntz. From my brief tests of the in-game timer from a minute ago: - the time when paused, when loading, when the "Click a mouse button or press any key to continue..." message is flashing, when the warpstone is already at the fortress (and chanting animations start to roll) and when the "NEXT LEVEL" button is visible on the screen does not count towards the stats page time
- reloading the game resets the timer to the state from when it was saved
And that would be all fine. However I've heard reports that the game timer can act funky sometimes. I can't imagine how testing these edge cases would look like on a test map and a stopwatch in your hand. My approach would be getting the in-game timer via Cheat Engine, showing it up on the screen and THEN fiddling around with stuff. I'm after some attempts to find that timer in the memory but so far to no avail. However I believe it's just a matter of ... time. <puts on sunglasses, screaming in the background ensues>.
Once we get that it'll be way easier to either incorporate the timer in our runs or rule it out completely.
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Oct 18, 2021 7:23:14 GMT -8
I've recently picked up an interesting idea of adding support for speedrunning Gruntz and I'd love to see the community get involved as much as possible in this project. Who knows, maybe the game will get more attention this way? My general/initial idea is: - add Gruntz to the speedrun.com database
- come up with categories and rules
- determine how the time should be measured for these categories
- upload some initial speedruns with accordance to these categories and rules
- moderate leaderboards at speedrun.com
I'm fairly new to speedrunning in general so I'm just learning how other speedrunning communites go about solving some of the problems and challenges. Therefore if anyone participates in other speedrunning communites, their knowledge is much appreciated here! In the meantime below are my suggestions: Categories
I see the following possibilities for categories: - every individual level (32 levels + 4 training levels + 1 secret level)
- speedrunning individual worlds (is it really worth it?)
- full-game playthrough at one sitting (should it start with the first training level or the first Rocky Roadz level? It also would have to not include the secret level for obvious reasons)
All of the above would come in two flavors: Any% (i.e. no PERFECT score) and 100% (i.e. with PERFECT score). And yes - a full-game playthrough looks like it's doable - a PERFECT run can be done definitely under 11 hours (I've summed up times from the stats pages for standard levels at the forum). I believe that anything glitchy shouldn't be allowed in the run. So no super springs for example (i.e. jumping three or more hole tiles in a row due to the routing error) for example. However there might be some non-standard game mechanics which might be allowed. I'll get into that once I come up with some good examples. Also I think that saving and loading game state should be allowed as long as it all happens within the same level and no save slots from different levels/runs are used. It's way to easy to get squashed by anything to prohibit that. We would also have to specify which Gruntz versions are we supposed to allow (do I remember correctly that the unpatched version doesn't allow PERFECT score for some levels?) TimingFor individual levels I suggest the following: - at the beginning of each level there's no player Gruntz, the level goes about its own business and the big message "Click a mouse button or press any key to continue..." flashes on the screen. The timer would start the moment the player closes that message and Gruntz of the player start teleporting in.
- the timer would end once the Warpstone Grunt enters the King's fortress and the victory chants ensue.
I've created a script for the AutoSplitter that detects the above starting and ending conditions and so the player will not have to bother operating the timer manually - it'll be all fully automated. For full-game playthrough the general idea would be the same. However there's a question what to do with intervals between entering a fortress and starting the next level. Should these count towards the speedrunning time or not? Or perhaps they matter so little to the overall playthrough time and/or PC performance (i.e. slower and faster level loading times) that it should be ignored by us? I put that to debate. Also there's yet another aspect when it comes to time in general. The game itself has a built-in timer which is visible on a stats page upon completing a level. It can surely make for some interesting challenges however I know too little about how the in-game timer actually measures time (for example does it pause with the game? What about alt-tabbing? Loading/saving save slots? etc.). I'm also afraid such timer would turn out to be too unreliable to be used in speedruns. But it's something worth thinking about in the future perhaps.
So what do you guys think? Cheers
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Oct 17, 2021 2:06:32 GMT -8
First of all Gruntz was written in C++ and compiled using Vistual Studio C++ (version 6 or earlier) and many assembly structures are strictly related to VC++ constructs (calling conventions, exceptions, RTTI data, some compiler flags etc.). So there's no really "preferred language". There's only THE programming language and THE IDE. I can't imagine decompiling Gruntz to Delphi source code for example - that would be a legitimate nightmare trying to convert all these structures to a different language.
I'm using Ghidra (for static analysis) + IDA Freeware 7.0 (for debugging). Although Ghidra has a C++ decompiler on its own it still requires lots of user input (defining structures, class hierarchy, exceptions) and the code itself might be heavily unreadable and resembling more low-level C than C++. I've also been heavily exploiting Ghidra's scripting engine which automated at least some of the tasks for me that would be otherwise too cumbersome to complete by hand.
I'm afraid for anyone having no reversing knowledge whatsoever and expecting to find a ready-to-go decompiler getting the job done within a single push of a button ... reversing would quickly turn out to be a major let down.
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Aug 25, 2021 22:18:55 GMT -8
captaingooback Nice! Thanks a lot for the suggestions, I'll look into them when I have a chance and update the spreadsheet. I'll let you know once I'm done
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Aug 15, 2021 22:46:04 GMT -8
It is always a good idea for us to keep these graphicz and tilez in mind. Eventually the source code will probably be reconstructed or released and it will be helpful to us all :-). I wouldn't be so optimistic about getting original or reconstructed source code. It's way more likely to wait for the sequel instead (which isn't very likely either). By the way, is there any particular reason for the tile 322 to have a brick with a black top?
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Aug 15, 2021 1:07:42 GMT -8
can the list still be updated? Only I am able to directly update the list but I'm open to any suggestions if you have them In fact I'm still in the process of updating it even as we speak. Just see the list of comments in the spreadsheet
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Aug 9, 2021 11:47:42 GMT -8
Thanks a bunch for helping! I appreciate it I am just printing out the spreadsheet ... 18 pages (9 sheets of paper) for review later. I don't think that's a good idea. Some entries may go through some changes. Since I compiled the spreadsheet I've already made a few corrections. You'll have to make sure your prints are up to date. Just had time to make sure I had everything I needed to provide some feedback.
ACKNOWLEDGE\SELECTGRUNT3B.WAV ... replace "Sic" with "Sorry" (slurred speech, sounds more like "sry". Actually it was supposed to be a word "psyche" (Wiktionary link) instead: "(colloquial) Used abruptly after a sentence to indicate that the speaker is only joking". I just got the word wrong. With that being said I'm a little unsure about it being "sorry"/"sry". I could swear I hear [saɪk] there.
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Aug 8, 2021 9:58:43 GMT -8
Hi there. It all started with the thread about what Gruntz are saying: gooroosgruntz.proboards.com/thread/353/gruntz-say-lost-thread back from 2008 (13 years ago or so? Gosh I'm old). Since I'm not the native English speaker I was always baffled and puzzled regarding the voiceovers of those little cute critters. With years passing by I started noticing and recognizing more and more words and references. Each time it felt like an old gem that made me smile, which was beside me all along and I just couldn't see it. At some point I've decided to revisit the idea of transcribing the voiceovers and started this little project. The general idea was to listen through all the voiceovers there are (there's exactly 1517 of them - phew that's a lot) and try to transcribe them in the most organized manner as possible. I quickly started using some annotations like ( ? ? ? ) without spaces (ugh, the annoying emoticon kept on replacing three question marks) for parts I didn't understand or <singing> for the parts to explain some context. I was also surprised to see how many different references to songs, movies and whatnot there were so I started taking notes and researching all possible references. I've got to know so many movies, shorts and songs because of that As a result I've compiled the following spreadsheet which you can view right here: docs.google.com/spreadsheets/d/1n12jbs1qeH9gVX_Jhh5n_3bJDcfN3y7lBMNNMx4JfY8You can see three columns there. The file name (as it is in the GRUNTZ.VRZ archive), the transcription and remarks. I'd really love to see you guys participate in this project. There are lots of parts I didn't recognize (which I marked with "( )" annotations). Also you can speak up if you find any errors, have any insights etc. For now you have the ability to leave comments in the spreadsheet itself (unless it gets spammed or whatever) although I'd prefer you discussed everything in this thread right here instead (to keep things going). So what do you think? Cheers
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Jul 31, 2020 11:37:30 GMT -8
A month ago (give or take) I started a very interesting project. I grabbed the Gruntz binary and started reversing it from the ground up. As a result I'm recreating the entire source code base of the game Gruntz and WAP32 game engine. Here I whipped up a repository where you can look up my current progress: GitHub Gruntz RepositoryBefore I go any further let me make one thing clear: it's a hell of a project and may take several years provided I persevere. The project may be dropped at any point. But it looks promising so far. Here's a few interesting facts I've discovered so far: - originally there was a "lobby launch" mode: if the game was run with a "LOBBYLAUNCH" command line argument and there was another game instance already running, it would find it and send it a message to launch a lobby, whatever that means. Unfortunately in newer Windows operating systems this feature stopped working (it uses some deprecated WinAPI structure fields for that purpose).
- some of you know that if you press Shift when running the game an advanced options dialog will be shown. What you might not know is that you can also press a Ctrl key or even a Home key to achieve the same result. The advanced options dialog box is also shown if you run the game with a command line argument containing any of the following strings: "adv", "ADV", "optionz" or "OPTIONZ". So you can run the game with: "Gruntz.exe AAAADVFOO" and it will show the options dialog unconditionally
- the routine of checking for the Gruntz CD in the CD-ROM drive is quite simple - it iterates over all available CD-ROM drives and if any drive contains a file "\GAME\GRUNTZ.EXE", it assumes the Gruntz CD is present.
- the WAP32 game engine uses polymorphism extensively. At the top level there are classes: CGameApp (which takes on application management duties and runs the game message loop), CGameWnd (responsible for managing the game window itself) and CGameMgr (managing game logic and resources). Gruntz derives its own classes from the base WAP32 classes and overrides virtual methods with game's logic: CGruntzApp, CGruntzWnd and CGruntzMgr. Obviously there's way more of these classes, I've just gone this far with the reversing process.
If a project like this will somehow be completed some new possibilities may arrive - switching the rendering engine from DirectDraw to OpenGL (which would already make it available for Windows 10), getting rid of all WinAPI dependencies, moving it over to CMake, porting it to other operating systems and adding modding support. All of this while keeping it backwards compatible with the original game. Right now however it's too good to be true and I don't want to get anyone's hopes up. I might drop the project after a few months after all. But I'll try to keep you posted with some interesting facts I discover along the way while I'm at it. Cheers.
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Jun 21, 2020 9:14:35 GMT -8
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Jun 14, 2020 0:56:24 GMT -8
Hey, glad too see a new face here! Although Monolith doesn't seem to care about the game (unless we try to make some profit out of it, duh), we still have a community here doing its best to keep the game alive: gamers, designers and programmers! Be sure to drop by our Discord server if you haven't already There's always something happening there. Cheers!
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Feb 15, 2020 1:42:33 GMT -8
The downloads work just fine for me. It must be something on your end.
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Nov 26, 2019 12:44:35 GMT -8
Sure thing we care. We're still here, and although the forum might seem to be stale, the community itself is a little more active on our Discord server. We're still waiting for you there, you know
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Post by Tomalla on Mar 10, 2019 6:12:00 GMT -8
Here's a little thought process I had recently about the spikes and how exactly they inflict damage. Gruntz take damage on a spikes tile only once they reach the middle point of the tile. Once they do and take the damage, they are subject to a fixed timeout during which they don't take any spikes damage at all. Once it runs out, they become vulnerable again and take another hit once (if) they reach the middle of a spikes tile. Now, Gruntz have different travelling speeds. Depending on that, they can travel further while taking the same amount of damage. Here's a breakdown how many tiles they can walk while taking only a single spikes damage: - 250ms/t - 4 tiles - Spy + Superspeed
- 300ms/t - 4 tiles - Normal + Superspeed
- 400ms/t - 3 tiles - Warpstone + Superspeed
- 500ms/t - 3 tiles - Spy
- 600ms/t - 2 tiles - Normal
- 800ms/t - 2 tiles - Warpstone
- 1200ms/t - 1 tile - Baby Walker
Judging from this spreadsheet, is it possible to tell what's the actual duration of this timeout? The first assumption we have to make is this: does a Grunt take damage if the timeout runs out exactly when he's in the middle of a tile? For now let's just assume that he does. We'll come back to this assumption later on. For each entry in the spreadsheet you can limit the possible duration of the timeout. Let's take the 500ms/t for instance: if the timeout was less than or equal 500ms, a Grunt would take damage on every spikes tile. If it was greater than 500ms and less or equal 1000ms, it would happen once every two tiles, and so on. Since a Grunt takes damage only once every three tiles, the timeout must be greater than 1000ms, but less or equal 1500ms. Here's the above breakdown with the limits deduced from each entry: - 250ms/t - 4 tiles - timeout: (750ms;1000ms> - Spy + Superspeed
- 300ms/t - 4 tiles - timeout: (900ms;1200ms> - Normal + Superspeed
- 400ms/t - 3 tiles - timeout: (800ms;1200ms> - Warpstone + Superspeed
- 500ms/t - 3 tiles - timeout: (1000ms;1500ms> - Spy
- 600ms/t - 2 tiles - timeout: (600ms;1200ms> - Normal
- 800ms/t - 2 tiles - timeout: (800ms;1600ms> - Warpstone
- 1200ms/t - 1 tile - timeout: (0ms;1200ms> - Baby Walker
If we intersect all the intervals together ... we get nothing. The only possible timeout value seems to be 1000ms, which has also been proven with a stopwatch. However our first assumption seems to be problematic: if it was correct, the 500ms/t Gruntz would take damage once every 2 tiles (and not 3). If the assumption was incorrect on the other hand, the 250ms/t Gruntz would take damage once every 5 tiles (and not 4). That's a truly perplexing discovery. It all just doesn't add up. If I didn't make any mistakes in the math, we have just one more mistery in the game, which will probably never be solved. Perhaps there's a hard limit on how many tiles a Grunt can travel without taking damage? Or the conditions whether or not a Grunt should take damage are executed in a different order depending on the circumstances and/or are more complicated? We will never know. Not until one disassembles the game of course and sees for himself what's the reason for these shenanigans. Cheers
|
|
Tomalla
Designer
General Modder
Posts: 525
|
Speedz
Mar 10, 2019 5:44:05 GMT -8
Post by Tomalla on Mar 10, 2019 5:44:05 GMT -8
It should be noted that the speed values in the gooroosgruntz.info/editor/Speedz.html are incorrect and should be the same as the values in the Gamer's original post. - Bomb Gruntz when doing the kamikaze run travel always with the speed of 200ms/tile. The Super Speed powerup does not influence the speed in any way.
- Warpstone Gruntz travel at 800ms/tile (400ms/tile with the Super Speed)
Why isn't this page listed in the GLE index page at: gooroosgruntz.info/editor/index.html? Is it listed anywhere at all? The walking speed values should also be updated in the corresponding tool/powerup pages:
|
|