This idea would have to be flushed out a lot to see if its viable. Map makers and players still want to see versions of the same map especially when the map is newer so it would mostly have to be under the covers IMO.
There is a question of how to link such maps. We already have a database of maps, it is a yaml file. To get to the immutable suggestion, every version would be a new entry. We'd convert the version and download link to a list. In this way we have an under-cover implementation for the most part. A good chunk of the benefit is from the assumptions we can make about any given download location. If we know a map version, and they are immutable, and we know the download link for a given version, we can always download that XML. Today with updates to maps, we lose that capability with the overwrite of new data, and we lose the information for the old location. I suspect there are more simplifications once things are immutable by convention. Basically, we would be optimizing for the 'copy/paste' and update strategy for maps : )
So there is already an engine version in the map XML. Its use could be expanded so that say the downloader reads it to avoid older engines downloading new maps. But you'd also have to ensure map makers are actually specifying the min version XML field properly.
Indeed, but:usability problem as you mention introduces a bulk update problem, we have to bulk update engine versions tracking engine versions in map XML, I think the two concepts should not be fundamentally related at all. I'd like to see the game engine depend on map parsing, not the other way round in a circular dependency. we'd have to parse every map XML to show the 'download maps' window, this is likely to be too slow. it's not known where a game XML will be, and there are multiple. We'd have to scan the entire file directory of a github repo to find the XMLs, and we'll find multiple.
It would help if games and maps were 1:1, then we would know the map XML location and maybe could parse the actual file on the fly. That would be nice as we could put other items like download description and map title all in the same file.
So if we add back in including past jar versions of TripleA then this could be useful but without those most players don't want to have multiple engine versions sitting around so any maps not upgraded are effectively dead. Also developers would most likely have to manage the max version since map makers would know what to set it to.
Good point, I've considered the same. But:old jar was not a complete/good solution. It did not work for the 1.8 to 1.9 upgrade. We also had to do work to maintain it, it made path loading very whacky and was hard to keep working. non-upgraded maps are already effectively dead, it's something of an existing problem I suspect developers will need to manage min-version even. Max version likely would be easy, it'll match to be the next version that is not going to be compitible. WE'd have to discuss what kind, if any mapping there is to the game engine version. So I'd envision this being set to 'version 2' everywhere. When we have a new incompatible engine, we would add a bunch of maps with min version '2' and max version '3'.
Would need a lot more detail on how this would work to determine if its feasible and worthwhile.
Should be feasible, we can introduce some logic to upconvert objects. I'd personally lean on the open-close principle when designing it. 'Worthwhile' should be pretty obvious I would hope. My experience of a player for a decade plus, I've heard a number of endless tantrum's from players before, during and after upgrades. I would tend to agree from experience that destroying a save game is one of the worst things that can happen. If we can lessen the need for a non-compatible release, we get a pretty good win-win where save games are not trashed, and developers can do their work with less effort, which means more work done per unit effort :)
Fixing save-game compatibility I think is the best thing we can do for this project. At this point, with the code and maps out of SVN, individual owners converted to teams, I think that is probably the highest impact thing we can do now.
If you want to make a set of triggers that applies to all territories of a big game with many players you can easily have that set alone being some tens of thousands of lines of xml code. I don't see anything bad about that, just that when you have too many of such triggers you start hitting the RAM or getting slowed down.
The same for actions codes, like making a serious political actions system, in a game with many players and many relationships.
As long as nearly unlimited triggering will be still possible, and what we have can be converted, or whatever, that's fine.
Currently, the xml is simple enough, if you stay basic, and everyone can pick its own level of complexity (comprising not using triggers at all), so, since I don't quite see where this discussion is getting, I'd just stay with what we have now.
I'm mostly worried about an automatic converter not messing up very complex and big conditions / triggers xml codes, as well as all current triggers / conditions capabilities being still available (like a trigger checking for a condition that checks for other conditions and other stuff).
In this suggestion, from me, the converter would not be XML -> XML. The map parser of today is effectively a converter from XML -> java objects (POJO). The problem we have is that the java objects created are 100% specific to the XML, there is no leeway to remap the java objects. To make it worse, we use those java objects everywhere in the system, so we're coupled to the XML text all throughout the game code. To make it worse we save that to disk on peoples hard drives, which then goes on to live for a very long time. It's an ugly problem, but we've actually done some pretty good work to unwire the POJO's from the rest of the game engine, so we basically have something like:
XML -> single java converter object -> POJOs
So an in-game converter would basically be: "If you see the word 'infantry', map it to 'army'".
XML -> adapter(java) -> single java converter object -> POJOs
Personally, the xml works just fine, so I don't feel a huge need to move to something else
yes and no. There is a lot of unnecessary complexity in the spec. Take note for example how certain relationships are redundantly defined. The XML spec file for how a game is setup, should not be thousands of lines long, let alone 10k, or 30k. All we are doing is specifying map and unit positions, and game rules. The fact it can grow so large makes it not accessible; we want map making to be really easy. I'm not necessarily saying we need to move to YAML, but the current spec is overly-complex for what it is, it can be simplified.
but if you have, like, 100,000 or more lines of coding, then it starts getting really heavy on the RAM (and on the CPU mostly if you are doing recursive stuff, like having a lot of activations), so the only thing I can think of I may be wanting is something that allows enormous xml to run with less RAM and CPU requirements, or being read and loaded faster.
There is the efficiency of parsing large XML's, but fundamentally we should not have such large files. We've already lost when any map file is over 1000 lines long.
Aside from this, I'd stick with what we have now, since it works fine enough, and I don't see compatibility as something to worry about that much.
@Cernel is that only because we do not break compatibility very often? Do you think the map XML is approachable for new people? We ideally want new map makers to join the group, IMO that should take 30minutes to an hour to create your first map, and maybe 10 minutes max to update an existing map.
I think it also depends a lot on the kind of followers a map has. If you break NWO savegames, I can see people getting angry, while I wouldn't expect reactions from TWW players, instead.
Hehe, when dealing with the engine, often the answer can be all, so we'd be talking about all savegames for every player. It's a bit of a running myth/theme that we lose n% of all players on every non-compat release. The splintering of community and trashing of save games is very upsetting.
The suggestions are not necessarily 1:1 or a complete solution to all the problems. It is an interesting question of how they map, here is that mapping:
1+3 (immutable maps + max version): helps B, solves C (D is no longer impossible to solve once C is solved)
2+3 (min+max version): solves A
1+4 (immutable+in-game conversion): can likely solve D
4 (in-game conversion): helps, if not solves B+C (maps from save game can be loaded with newer engine, and if engine can read older maps, then we don't have to do C, update all maps)