So some notes. I did talk directly to feos via Discord as I waited on this to wrap up; this is largely just a summary of what was said there.
To begin with, to answer feos' question:
Certainly.
I wound up rewriting this to have two files output.
The first is still just the videos it thinks needs updated.
The second is all videos, regardless of whether it thinks they need updated.
In both cases, the script gives the following data:
* title
* url
* highest height amongst all formats
* highest width amongst all formats
* highest fps amongst all formats
* whether it believed (based on the script) that it needs updated
WARNING! The three features for which the highest is given are not necessarily from the same format - in effect, not necessarily from the same version on Youtube.
The source file has been updated in the gist. Here it is again, anyway, just in case the address is needed:
https://gist.github.com/greysondn/ed8167c273b3617099c813cabac2901d
I wanted to staple outputs from running it right now to that gist but - no joke - they're too large. So I've put them in two other gists instead.
Here is the json for all the videos, which you'll have to pull the raw to see all of:
https://gist.github.com/greysondn/41463a7b7b912e39b2f94d897993b332
And here is the json for just the ones the script thinks need updated:
https://gist.github.com/greysondn/227ba283bbf88a67d97acd310e2e5cc9
Just one more aside here that is in feos message that I noticed last minute:
The line feos links to here appears to be related to youtube-dl's console output. However, it is possible to embed youtube_dl as a library in python as I've done here. Why interpret the console output if you can ask the library directly? feos did already answer this: it wasn't known that it could be used as a library, and in feos's defense outside a comparatively brief note in the readme it's not immediately obvious how to do so. (I had to keep using python's help() function to get data on the objects in use - I didn't see any precompiled documentation, even if it is all well documented in the source.)
Was a small error in that file for what it is. Should be fixed now.
The whole thing is - if you'd give me something that is deterministic and robust enough, I can write that code. What appears to me is that it is not as simple as throwing a figure out, and it may not be as simple as searching for that figure.
I wrote assuming the solution requirements to be:
* There is some target format(s) for videos, some don't match that
* Videos should be on the TASVideos Youtube Channel
* Anything not matching that format needs an update
What I believe I am following from you is
* There are some target format(s) for videos, some don't match that
* However, my list isn't necessarily correct to the target formats
* And beyond this, for some reason, there's a need for the "best" format to still be listed? Instead of checking again later against whatever the new target formats are?
* Videos aren't necessarily on the TASVideos Youtube Channel
* Anything not matching the format thing needs an update
This however doesn't seem to be making anything clear.
Beyond this, much other data can conceivably be dumped, if there's some use for it. It was omitted because there's not an apparent use for that I understand.
Likewise, for example, if there's some keyword that distinguishes games that can be ignored, that wouldn't be impossible to work with. (Occurred to me while wondering if obsoletes actually get reencoded.)
Code monkey not crazy, just proud.
Let me show you what I can see here from a single video. I'll just pick on myself for this task.
greysondn@LAPTOP-27D4Q1U4:/mnt/c/Users/Dorian Greyson$ python3
Python 3.6.9 (default, Oct 8 2020, 12:12:24)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import youtube_dl
>>> ytdl = youtube_dl.YoutubeDL()
>>> out = ytdl.extract_info("https://www.youtube.com/watch?v=FNGcikv7jx0", download=False)
[youtube] FNGcikv7jx0: Downloading webpage
[youtube] FNGcikv7jx0: Downloading MPD manifest
>>> # ---------------------------------------
... # All data for a given video that I can see
... # --------------------------------------
...
>>> out.keys()
dict_keys(['id', 'title', 'formats', 'thumbnails', 'description', 'upload_date', 'uploader', 'uploader_id', 'uploader_url', 'channel_id', 'channel_url', 'duration', 'view_count', 'average_rating', 'age_limit', 'webpage_url', 'categories', 'tags', 'is_live', 'automatic_captions', 'subtitles', 'like_count', 'dislike_count', 'channel', 'extractor', 'webpage_url_basename', 'extractor_key', 'playlist', 'playlist_index', 'thumbnail', 'display_id', 'requested_subtitles', 'requested_formats', 'format', 'format_id', 'width', 'height', 'resolution', 'fps', 'vcodec', 'vbr', 'stretched_ratio', 'acodec', 'abr', 'ext'])
>>>
>>> # -----------------------------
... # dat about formats that I can see
... # ----------------------------
...
>>> type(out["formats"])
<class>
>>> type(out["formats"][0])
<class>
>>> out["formats"][0].keys()
dict_keys(['format_id', 'manifest_url', 'ext', 'width', 'height', 'tbr', 'asr', 'fps', 'language', 'format_note', 'filesize', 'container', 'vcodec', 'acodec', 'url', 'fragment_base_url', 'fragments', 'protocol', 'format', 'http_headers'])
>>>
>>> # -------------------------------------
... # for example...
... # -------------------------------------
...
>>> out["formats"][0]["format_id"]
'139'
>>> out["formats"][0]["width"]
>>> out["formats"][0]["height"]
>>> out["formats"][0]["fps"]
>>> out["formats"][0]["format_note"]
'DASH audio'
>>> out["formats"][1]["format_note"]
'tiny'
>>> out["formats"][2]["format_note"]
'tiny'
>>> out["formats"][3]["format_note"]
'DASH video'
>>> out["formats"][4]["format_note"]
'DASH video'
>>> out["formats"][5]["format_note"]
'240p'
>>> out["formats"][6]["format_note"]
'DASH video'
>>> out["formats"][7]["format_note"]
'240p'
>>> out["formats"][8]["format_note"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> out["formats"][7]["format_note"]
'240p'
>>> out["formats"][7]["width"]
256
>>> out["formats"][7]["height"]
224
>>> out["formats"][7]["fps"]
30
>>> out["formats"][7]["format_id"]
'18'
>>>
Essentially, at this point, it makes more sense to fight with it yourself to get specific data. The best I can offer is a massive headache of a json file dump of all formats and what they say, because the data isn't exactly straightforward.
What is "best" is a bit subjective here, too, once we stray from "absolute best". In other words, what you're asking for ends up being a JSON dump of the data for the entire channel, sooner or later, as opposed to focused data; sifting it becomes not-my-problem.
That can be done. I can do that. All I need is the "yes, quit being a jerk and just dump all the formats with their data into the output json".
Edit:
There is a middle ground of organizing the format ids in a preferred order, then listing the first of those (or if none at all exist). In other words, I'd need some semblance of youtube's format IDs in a preferred order. I know we all want to say "2160p60 or p30" and be done with it, but sometimes - and this is no joke - that stream is literally silent video and there's not much warning without rifling through all the data or knowing their format ID.
It's also of note that a large part of the problem comes from how Youtube tags these things, which is perhaps unfair to be quite so snippy about. (Well, snippy at anyone but YouTube, anyway.)
After watching, I didn't vote because of what I'm going to say here.
I am not very entertained here, but this may have merits for a speed completion for minimum high score.
Essentially, whenever you end up min-maxing scores, the brutally, mechanically efficient route is always going to end up somewhat repetitive or else mathematical. Part of the interest to me in watching TASes is the weird routing they often enable, but there are always going to be games where the optimal path is a dead, mechanical path through whatever provides the most benefits.
Here, that happens easily through the first two events - while decisions are made for speed, the majority is a cycle of the same actions over and over because that maximizes score. Surfing I never did understand as a kid so I'm a bit lost here (even reading your notes); the fourth event is much the same and dynamics are given by the environment mostly. The dirt bike event is at least some break away from that repetitive nature thing (again, environment, but also not just doing the same pattern of actions over and over the whole time). Discus throw is what it is; there's nothing wrong with it (and one can only do so much anyway).
The problem here, and the reason I don't want to vote, is that while I'm not entertained, I do recognize *these are likely the fastest or very nearly the fastest completions for the minimum high score*. For the events I do know from a million years ago on a Tandy 2 in DOS, I certainly can't think of much better routing for that goal.
I should say that *more likely than not, this is going to be a recurring issue with sports games scored in similar ways*. I think the fault is less in the runner here and more in the way the game is designed to reward such series of actions. Again, given the stated goal, the runner has optimized the route as far as I can see; that the game rewards repetition is no fault of the runner's in that regard.
And here I was afraid to revive it.
I've been looking at this a little and the idea I have is more like a window onto the background, which is kind of how animation paths are laid out anyway, vaguely. Years and years ago there was a map autostitcher that could do gifs where it would draw a window on the map in a similar way. If I can remember it, I'll dump an example of it. A similar outcome seems like the most dynamic thing one could manage.
However, for animations where things are relatively repetitive - such as animating Mario running through a scene - a better option is to use the pathing to move a singular entity (Mario in the example here).
Failure. At 13:32 and 22:18 and 23:49 in the video, it accidentally erases some of the outlines, by using the paint tool one pixel off.
In the picture at 27:25, it forgot to color one pixel between the rear feet. Granted, that’s not part of a dino, so it didn’t fail to color a dinosaur there, but…
Nitpicking aside, fun video!
Wondered if you were still around.
Thanks for itemizing some of the errors. I did know that at least one existed, but I've been playing Terraria a lot this last week and haven't worked on the code needed for this.
nobody wrote:
just a break here to switch contexts
I still plan on fixing that code and doing a better routing; problem is that it may not appear until next April 1st depending on how things go here.
Most the background code for routing on an arbitrary graph I've already written with unit tests to prove correctness (I hadn't done it in some time anyway); I need to rewrite the plotter on top of it still and actually write a minimum path finding algorithm still.
Insofar as it goes, I'mma just brute force minimum paths, I think. Even iterating every permutation, it's still possible to reject early:
* permutations must have a specific start and end (we know where we start in the recording and where we want to end up); we can reject anything that doesn't follow that rule.
* a known maximum target for time in frames (the basis of our optimization) already exists; set the target time one frame higher than this so that it definitely passes "eventually"
* keep track of the best time found (starting the value with the above) and the series of moves that creates this; when evaluating paths, reject if they exceed this value as soon as they exceed it instead of analyzing the full path.
There are special categories of pathfinding functions when the transition cost between nodes can potentially be less than zero. Thankfully, none of them are necessary here; because our transition cost is measured in terms of time, it can never be negative.
Python has a generator for permutations that yields all permutations of a given sequence. I've never used it, so I'm not sure how efficient it is. However, I thought it might be interesting to note if anyone retraces my footsteps later on.
I shouldn't post when I'm barely conscious. I probably am not making a lot of sense right now. Swear it makes sense in my head.
I would not be interested in a Mario Paint tech demo that has no real gameplay, and I'm not sure such a movie would be publishable.
Noted.
Arc wrote:
I like the movie in its current form pretty well, not just for the memes. I think it would be publishable as long as there is a real gameplay element. [...] But the author has done so by using Mario Paint as a resource to recreate Color-A-Dinosaur, which can be considered a game as long as there is a specific goal (like properly coloring all the dinosaurs as fast as possible).
The problem with free-form creativity activities is that "proper" turns out to be very loose and at times poetic when judging whether something is "properly done". There would have to be a strong definition of what, exactly, the goals are in order to judge relative speeds in a universally fair manner. In that sense, the community would have to establish a category with constraints.
Arc wrote:
To summarize, I like seeing Mario Paint used as a resource to create a whole new game (like Color-A-Dinosaur) that has a gameplay objective that is optimizable (not necessarily speed, but speed makes the most sense). The created game itself does not have to be all that interesting if the method of constructing the game is what makes the movie impressive and creative, which is the case in this scenario.
I appreciate the compliment.
I would (again) assert a specific objective checklist with maximization target being speed may be the only viable strictly objective testable target line for such runs. There are plenty of other merits, besides, but if you want something objectively testable and optimizable, that is going to have to be the basis.
However, a followup question: Why this specific recreation instead of some other coloring-based video game? More narrowly, where should the community draw the line in permitting demands for new categories under such a framework?
The only issue I see with drawing Nintendo characters is that it runs the risk of being too similar to Brain Age, though I still get your point. More variety in drawing without overstaying its welcome by doing too much. More on that note...
Well, it's never too late to just load the coloring pages, which would show off part of the functionality, but I'm not sure that's terribly interesting from a technical standpoint. "Wha- I could have watched my [little/big] [sister/brother] color this!" sort of things. (And I did watch others color them countless times when we were younger.)
I think that something along the lines of quickly drawing in Waluigi is more entertaining when it comes to Nintendo characters. The man needs more love. (I'm only half-joking there.) Four-to-five images wouldn't take that long to do, even at the ponderous pace this run takes; the harder part, for me, is finding art that won't cause a stir by its mere inclusion that fits size and design constraints. Still, spreading that handful out across different platforms' content would probably work out fine.
Samsara wrote:
Absolutely this. Everyone interested in seeing Mario Paint published, please pitch in with what you'd like to see in a future submission!
About publishing at all
It would be a very me kind of thing to have helped people with research and tools all these times over the last several years and have my only published run be something so ridiculous. I swore I'd never try for publication. I suppose it's too late now; the mind-virus has me. If you're reading this and they've not convinced you to try - run! You can still save yourself!
In other words, I'm totally for it being published, I just have a conflict of interests in saying that here XD
Content I'd like to see: Dinosaurs, of course
Although, to be 100% real here, I would still prefer to keep the two dinosaurs that were previously colored by the community in; I think legacy value of those in the category of paint-games-on-console is far too high to let go so easily. Still, we're talking just 2 when I say this - not 16 - and I think coloring it with stuff from Mario Paint so it has a facelift would be a good step forwards here; people who want strict loyalty to form can look forward to next April Fool's Day when I inevitably obsolete this run or look at this April Fool's Day. I'm not sure about the rest of the run.
About Gnat Attack
I am sure that I don't want to see gnat attack, personally, for two reasons:
1 - Its boring as sin through all of it but the boss. I tried running it for AFD but it didn't even keep my attention. Both when running it and when playing it back.
2 - Gnat Attack features some fifteen or sixteen little trophies you get at the left hand side of the screen. They don't appear anywhere else in the game and one is awarded each time you complete Gnat Attack's three stages. So you have to play three stages at least fifteen times. That are already pretty dull in and of themselves.
Nintendo themselves stated that Gnat Attack was more a minigame to help with mouse coordination than a proper game. I get the distinction isn't meaningful here - it is, after all, still a game with defined end goals and mechanics - but that's like bone dry vault material, to me. I'd rather watch someone color 16 dinosaurs. On the NES. And - while this may be hard to believe given where I'm saying this - I don't enjoy CAD as a game at all.
About the Title Screen
There is an absurd amount of content on the title screen alone - nearly enough to put Stardew Valley's title screen shenanigans to shame, in fact. An appropriate duration for showing those off would have to be negotiated, but I'm confident I can feel that out reasonably well.
About features I didn't show off but know exist
There's a pair of cheat codes/hidden features (depending on your definition) for Mario Paint, actually, which is why the second port has a controller in my recording and why I assert it's the correct controller configuration for the game. I went looking through documents everywhere, which led me to find the cheat code over on gamefaqs, although most people here would probably prefer TCRF's notes:
> There's a set of rather useful features that are, for some reason, disabled by default. However, they can be unlocked via a simple "code" on the title screen. Click on the "N" in MARIOPAINT™ to start the staff roll, and when "PROGRAMMER NORIAKI TERAMOTO" appears hold the right button and click the "N" again. Congratulations, you've unlocked the power of the right mouse button!
>
> The list of (currently known) hidden features are as follows:
>
> * Right-clicking anywhere on the screen will activate Undodog (with a few exceptions).
> * Right-clicking on the canvas in the Stamp Editor will sample the pixel color underneath the cursor.
> * Four new rotation options are available in addition to the old horizontal/vertical flip options (see screenshot).
> * Pressing L + R + Start + Select on Controller 2 will reset the game (code will need to be entered again).
TCRF also explains the use for the second controller beyond just that feature:
> Pressing A + B + Start [on controller 2] will start the game without having to click on Mario.
> Pressing A + B + Select will (after a short delay) load and display the currently saved drawing, animation, and music. If nothing has been saved, "NO SAVE DATA" will be displayed instead. Reset the console to return to the title screen.
My impression has always been that such things are outside the scope of permission at TASVideos for publication; nonetheless, I did want to ask if they could be used. I don't know that I have much use for the right-click features other than rotation options. I do, however, suspect that not clicking Mario would save a little time - both in terms of being able to position my mouse without worrying about meeting him (the mouse position is retained from the title screen to the main canvas) and in terms of... not having to wait on him to appear or whatever depending on what I'm doing.
Re: playaround endings:
Samsara wrote:
feos wrote:
I think whatever makes the audience feel entertained and happy is good.
-- trimmed --
A game over, perhaps, just something that signifies that the run is over. [...] I believe the audience can define things other than the game's actual ending as a legitimate endpoint for a playaround.
A drawing of a gameover screen? I don't think we need more than four names on the credits at the going rate for this theoretical playaround. There are multiple approaches to that, but they'd easily fit on a gameover placard.
Later on, talking about feedback/rating/publication/etc:
Samsara wrote:
I'll toss a thread or two into Sites later on so it doesn't all have to be contained within this submission, though I'd definitely appreciate if anyone else had anything to say about these topics in the meantime!
I started to say a lot here and I just don't seem to reach an endpoint. I'll say a little instead.
Entertainment value needs to stand independent of memetic qualities, although memetic qualities can be tolerated and - to some degree, with the community's injokes and history - should likely be not-discouraged.
A space that reflects things of entertainment value that fails on other merits may be in order; playarounds do have some degree of that, but it seems like what I'm hearing (and have heard in the past) is that the community's stances and the judgements haven't lined up, and building a space that bridges that is important. What that would look like, the standards, and how to make it concrete are all beyond me - especially of concern is that if designed poorly it would let people turn voting for TASes into a popularity contest instead of raw criticism and/or genuine feeling on the work in question. Which, again, it has been my understanding this is against the site's stated goals; personally I'm not opposed to some sort of community curated section, but that seems to me like it would be an entirely different site, almost. The distance between, say, a standard news blotter and a news subreddit - or whatever you'd like here.
Samsara wrote:
Many people believe that Tech Rating is antiquated and shouldn't be used anymore, myself included.
I don't necessarily feel that way. I feel if we're talking about "being superhuman", then some degree of technique and understanding of the game is necessary. Being said, I think the proper pivot is going to be in deferring to that specific game's experts - or in runners doing (and showing) their homework where such experts simply can not or do not exist. (This run actually is, to some degree, an example of what I mean here; lack of material meant that I had to do the legwork gathering it on my own. The long notes show that process, and also the collation of that data for easier reference.)
Samsara wrote:
I honestly don't see the need to open it up further to the public, especially with how subjective it ends up being for a rating that's meant to be entirely objective with actual criteria behind it. It just ends up being kind of a mess overall.
Given this, I may be misunderstanding the first snippet taken from this bit. Regardless, I would agree; at the level of play we quickly end up talking for any game people are serious about optimizing, armchair experts are simply of no value. We need actual content experts capable of evaluating such things.
I don't think - I feel I should say - Mario Paint or Barbie Game Girl are high stakes. However, in games like Super Mario Brothers and Sonic the Hedgehog, the continuous pressure to get just one more frame eked out does require expertise both to run and to evaluate the merits of such runs. Those sorts of things are high stakes, for many reasons.
Hopefully I'm being clear enough here. I don't look down on people, necessarily, but I think that:
* Technical understanding is required to judge technical merits
* Judging non-generalized features of a run requires deeper understanding of the game being run
* There is no easy way to have open voting on such merits without having people who lack the qualifications to make an educated evaluation also voting on them
Stone cold, if you can shell jump consistently I'd vote you A+ for technical merits in a run featuring it. I don't think that's a sane basis for voting, yet that happens because I'm not an expert Mario World runner and I'm incapable of that maneuver. There are aspects of Mario World I could judge fairly, even on technical merits, but I do not have the knowledge and intimacy to do such things just by watching it and thinking for a moment.
This exact gap between experts and even just people with a decent amount of time and practice in - and, even, a computer science degree - is where my concerns lay there.
And for my anxiety:
Samsara wrote:
greysondn wrote:
I really don't know if I should feel good or bad about causing this much conversation. Or if I should be going away and just letting this happen instead of saying what I can.
Good! Feel very good about it. These are conversations I've wanted to have for a while, it's lovely to finally have an opportunity. It's likely that the site will end up better for it. c:
Oh, okay then. Thanks for that reassurance.
Proposed Playaround Progression ATM
Target duration: 15-20 minutes, depending.
Title screen: Show off some of the features, input the two codes if allowed.
Stamp Creator: Create the 15 stamps quickly, assume nobody's taking over this time. I get nine extra to play with! <3 But in perfect seriousness, I probably just want 1 pixel stamps in each color guessing it right this instant. We'll have to wait and see how that plays out.
Main Canvas: Do some drawings, leave it with the setup for an animation background. Erasure doesn't necessarily need to be rushed - pick personal favorites or interesting ones.
Song Creator: Input song for animation. I'm not sure what the maximum length song is, or maximum length animation, but given how insanely fast some six measures could be input into the game, I imagine some 30 measures are well within reason if that pace is maintained, although realistically I'm looking more towards (hopefully) 15-20 measures "or less" at a slower tempo. (It helps to remember those six measures are 4/4 at 600-ish BPM - approximately 2.4 seconds long. An animation would presumably merit a longer song, in order to accompany it.)
Animation Land: Create an animation! I don't even know the canvas sizes, path limitations, or anything! That's some whole new science right there. And then, of course, present the entire collage as one cohesive unit.
More: ? Not sure, but it would go here. A second animation and song, or more pictures? Well, anyway.
Gameover/End: A simple drawing (and presentation) of the same would suffice, I think. The main catch here is just trying to be faster this time; the credits for AFD were quite slow.
Assuming sufficient optimization, could another, different submission of Mario Paint be actually entertaining enough without fully relying on meme value? Could THIS run, if it was redone with proper optimization, be enough to make it?
If routine waits can be reduced, I think yes.
Probably If I do literally the exact same endpoints, just optimizing the move speed would probably give us something like a few hundred frames an image - figure about 2000-ish through the entire run. (30 seconds) That estimate is extremely conservative; I'd not be surprised to see it be better.
If I optimized the routing for literally everything (which I've been steadily working on the tools I'd need), probably gains measured in minutes are possible over the initial submission for the exact same endpoints and goals.
That work would take some time. Banging out one-off code and just getting something half-decent done for a joke was one thing. Writing out, testing, and fixing good code would take a while.
I am still listening for guidance on what specifically the community would like to see in a run of Mario Paint. It may be of help to everyone here listening - judges and runner both - if the community would make moves to make that information clear to all of us, as we all seem to be moving to understand it for different reasons. (Yes, even just "do the meme!" gives some insight here.)
I really don't know if I should feel good or bad about causing this much conversation. Or if I should be going away and just letting this happen instead of saying what I can.
For that reason, I'd like to get some non-AFD feedback on this run. To people that voted yes: Do you actually find the run entertaining, or did you just vote for the coloring of dinosaurs, as is site tradition? To people who haven't voted yet: Is this worthy of publication as a playaround, or is it just a site meme with only niche entertainment value?
My feedback has to be worth something here.
Numerous possibilities for improvement on time existed from the start. This was known and is in the seemingly endless submission notes. This should be weighed alongside other factors - my impression has always been that the speed and certainty in which things are done counts. Those things are often lacking here; time pressure for production (to meet an AFD deadline) meant that many things were done clumsily by hand. I have zero shame in admitting that given my intention from the outset.
But even if we discard that and speak about pure technical achievement, errors in the tools used to produce this run are known, and the run itself successfully fails at reproducing the CAD images exactly. I've not gotten through enough work on that code to know exactly how or why. The point remains that this should be done with cleaner code, that doesn't fail under certain circumstances.
Entertainment value is subjective. In that sense, I cannot and won't weigh in. I can state for the record I'm still rather astonished at this outcome; even as an AFD joke, I hadn't expected this to go over so well. (Which I keep saying.)
There is only so much that can be done within the confines of Mario Paint. Given this, I'm open to the community's input on what they'd like to see in a run if (and only if) intent to actually publish exists. (Or intent to push for publication, anyway.) That - certainly - is not where I saw this going more than a year ago when this story began for me. (Which, again, I keep saying.)
What is clear to me having attacked it is that we don't really know much about Mario Paint's behavior because not many people really spent the time to focus on it. I pointed out numerous problems during the run and inconsistencies with what I thought I understood. This should weigh in - would better understanding lead to a better run? Would that be more appropriate for publication? What is the actual limit of how high/low we should set expectations in these regards from a playaround? Does this run meet those?
At the end of the day, at minimum, if we're talking seriously about this, I think that the drawing code needs fixed and the process of coloring itself needs to actually be optimized for speed. These are things that haven't been done yet. [Edit]: At maximum, wowee. I'd love to get part of this examined via disassembly, and key parts already come to mind. That is, however, outside my talents.
I wouldn't know. It's an effort to make my loquacious conveyances circumvent excessive sesquipedalians.
But in perfect seriousness, you're right, I'm sure. Such failures in finding "normal" ways of translating thoughts to words are quite common coming from me, apparently. Honest to goodness, I'm trying quite hard here and hope nothing I've said during this production has offended anyone, even if some of it is weird or hard to understand.
The AI plotter had some trouble at the end of Crested Dinosaur, was that related to the 10px issue with the game?
I'm uncertain. More likely seems to be related to the same issue that makes long moves fail as far as I can tell. It's only this side of trying to beat the deadline that I've got time to slow down and actually properly test this code. I'm slowly working on that. Certainly if publication is chosen that needs fixed, as well as several spaces where I didn't have time to even set the route to be as quickly as possible. (It's going to be very weird if I have to obsolete such a thing O.o)
I've stated previously and will state again: I didn't expect this to be received THIS well.
I started to talk about how ambiguities are solved at will, but I did load the original game.
Here it is in Mario Paint, with what looks like an ambiguity.
https://imgur.com/SHyp7dk
And here it is in CAD on the NES, without one.
https://imgur.com/K7r8cVU
It appears the image itself had an error in being drawn. Which is concerning. I could have sworn I checked them as they were completed against the raw images.
Blaaaaaaah so there's one mistake. Beyond the point of handwavy "eh, you know, color a dinosaur" levels.
----------
Edit:
I've decided that this has been enjoyed more than I expected, and I'm going to figure out what's wrong with that plotter code. Or at least try to. So that will take some time and some work. Going to refactor this instead of writing it as a one-off code project, too.
It has finally happened. I have been absorbed into the hivem-
Spikestuff wrote:
So you basically did all that in a week? That's impressive.
A week of labor at 8 hours a day, 7 days a week would match the time investment. So I guess for normalized labor (8 hours a day, 5 days a week) that's a week and a half.
In absolute terms, the majority was done over 7 days, so you seem to be right there.
greysondn wrote:
... it does present very interesting optimization problems that have some application in the larger scheme of TASing...
Just to expand on this, if you can reduce the pathing issue to an image, this could theoretically find the next valid target position already.
In real terms, you actually would want to encode some of the game's rules for state to state transitions, and positions then become states. You could still do pathfinding over the state graph; your cost is now in frames.
The best early candidates will be games like Mario Paint - where space and state are very nearly synonymous most the way - and games that are puzzles with discrete, player controlled transformations - Kwirk apparently was once being worked on in some comparable way.
I feel a need need to stress that none of my code is particularly special. Turtle graphics, pen plotters, REPLs, and case-specific search graphs are made almost every day in computer science. I don't want people to think that part is a breakthrough here.
My attention seems to be being dragged towards Kwirk at the moment. No promises. (And with or without promises, no guarantee I'll make any advancements in it.)
Edit: And the majority of games will not be good candidates, because the list of states is explosive. The best you could hope for, then, is to analyze a subset of states or subset of conditions.
Bluely, if you can tell me which version of Ubuntu you're running, I can probably get the release file in place for it in the tinatos PPA. I've also asked you over Discord and I'm much easier to reach there.
You can try:
lsb_release --codename
In a terminal.
If you don't have lsb_release, you can install it via:
sudo apt-get install lsb-release
So, if you're running ubuntu bionic (32-bit or 64-bit, doesn't matter) or anything based on it (Linux Mint Tessa, notably), "do I have something for you". I've pretty much been nonstop at working at getting a build running and in a PPA, and I seem to have conquered that much. (The Discord can tell you way too much flurry of activity and keeping an ongoing play by play has been going on with that front, but at least the community gets something out of it.)
PPA is here:
https://launchpad.net/~greysondn/+archive/ubuntu/tinatos
I've pushed the source to the PPA if you wish to review it, but you can also get it from here (might be a bit behind the PPA as I build, ship, test, then tag and push changes):
https://github.com/greysondn/gnash
if you want to install this, then in Ubuntu Bionic it's:
After which running should be as easy as calling sdl-gnash at the terminal.
I'm more than happy to throw the build flag on versions of Ubuntu later than Bionic if anyone is running it. I don't want to struggle with earlier versions.
I know that runs when installed into a clean Linux Mint Tessa x64 image. I've not tested x86 at all. If you hit problems, the best thing you can do is tell me. Run it from a terminal and tell me the error it hits. I won't be patching problems in gnash, but if I've messed up dependencies I can fix the package. (Think of me less as programmer on this one, more as packager. I just put it together in a useful form, I didn't write it.)
If you hit problems and you installed previously via alien... Like, literally this is to avoid needing alien and the problems it can cause, can you just reinstall or undo that or whatever please?
Debian users, you're welcome to try the .deb itself. You'll have to retrieve it manually and accept it as signed with an unverified key. [...] My package key is 2B416C0DC8370D269C512232C1D378BA1BAE8DCA ... server keyserver.ubuntu.com ... if you would rather have the ability to verify against it. [...] Any more than that you're on your own; I'm not struggling with Debian. I hope the package names match but can't guarantee it. (Ubuntu's package server indicates it's just upstream with a couple compat patches, so odds are good, actually, for once.)
Technical users, the build-deps are overzealous. "Definitely buildable, almost definitely more than necessary." Trimming that down is one of my next goals, figure each time I build and test I'll trim it down a little more. Builds are presently dpkg-buildpackage -rfakeroot -S -kgreysondn@gmail.com ... followed by dput changes to repo where launchpad's build servers take over. Specific configure settings are stashed as part of debian/rules. A single line install def for package build exists at debian/sdl-gnash.install ; man link is defined in debian/sdl-gnash.links ... I've not added my name to the license files but I consider my work on package GPLv3 given upstream for same files was that.
Way late edit: Improve PPA address endpoint.
root@ork-VirtualBox:~# aptitude install gnash
The following NEW packages will be installed:
gnash gnash-common{a} libboost-program-options1.65.1{a}
libgif7{a} libjemalloc1{a} libsdl1.2debian{a}
...libsdl1.2debian is encouraging to see there in the requirements list...
root@ork-VirtualBox:~# sdl-gnash
sdl-gnash: command not found
... Surely they wouldn't lie? Baffling. What happened here?
root@ork-VirtualBox:~# which gnash
/usr/bin/gnash
Tried to tail/head for build symbols only to find out it's a shell script that wraps different versions of gnash. ... WHAT?
Gist dump of that file:
https://gist.github.com/greysondn/44575c4caa77a7bd630536da5c9c1f3f
... okay, let's look at that. Apparently according to that if we call "gnash -G list" it should list out available uis for us.
root@ork-VirtualBox:~# gnash -G list
Available guis: gtk
I think I just found one more reason to hate Ubuntu. The manpages are lying, and they're not even good at it.
Yes, this happens even if you try to call down the man pages in your local Ubuntu install.
Next step: Try to build sdl-gnash under Ubuntu.
-----------
7/12 01:55 Eastern US - I did get it to build. Renewed my package signing keys, opened a github so I could track the changes I make, and now I'm just chipping away at getting a proper deb built. Ubuntu's default config doesn't ship a .deb with it in it; I'd like to just ship one with only that in it. Working on it, working on it.
Hola Senor English!
While I may be biased, I must say, humor aside, *this may be legitimately vaultable*. It is for that reason (and not just my bias) that I am voting yes.
Whether we should permit a game that is - largely - awful minigames and absurd cutscenes in the vault is a question I would leave undecided insofar as myself; I only would submit that this may very well be record time.
And - naturally - we should put it in other places if it seems entertaining as well.
As far as my involvement, you're welcome.
I got to 30 seconds in, where you (painfully) fail to boost from a koopa bounce you (absurdly enough) could have easily set up and seemed to be setting up, and went "NOPE." If you aren't going to boost that jump, at least putting things in a place where you don't need to wait to hit the ground from absurdly high in the air before advancing again would be wise. There's at least two ways that can be done better, and neither of them require any special talents.
TASing isn't about playing a game well. It's about playing at a superhuman level. Please take the advice people have offered here and in Discord to heart.
jlun2 asked about this in the discord - whether it was actually a workable/practical thing or not. I'm going to quote my response there as it may have value as you start to do something like this.
It's a coorelation/causation thing. That combo is very dangerous to assume is a code segment just because it's in hex in the game ROM. Such combinations can arise also from, for example, graphics and text data.
If I read him right, "no, it's not impossible; however it should be applied with caution as it's not 100% foolproof. It will yield a place worth investigating if done right... that does not mean it will yield something worthwhile."
For shared code, if you can find the specific blob and just search for exactly that, you would probably locate shared code segments.
If we know some exploit for that code segment, that may be actionable.
But be aware that "we know for a glitch for a game that has this code segment" and "we know a glitch for this code segment" are two very different things.
Beyond that, impressive consideration of a toolkit! I'm usually the one looking for patterns and even I don't recall thinking to ask "is there a pattern we could detect in these older games?"