lovalmidas Posted July 13, 2020 Share Posted July 13, 2020 I apologize for spamming 'research topics'. I wanted to hijack an existing research thread for this file, but I didn't find a dedicated thread for it. The format of circles.bin is straight forward: Spoiler Circles.bin Associates a radius with a square depicting a circular region. The game has a limit of 8 entries (from 0-cell up to 7-cell radius) Used for sight range for uncovering shroud. (FF disable shroud reveal for that cell) (00 enables shroud reveal for that cell) (other values may have interesting results) Allocations: Size(h) Size(d) Offset(h) Section Comment 0x0001 1 000000 Cells for 0-radius circle 1x1 grid 0x0009 9 000001 Cells for 1-radius circle 3x3 grid 0x0019 25 00000A Cells for 2-radius circle 5x5 grid 0x0031 49 000023 Cells for 3-radius circle 7x7 grid 0x0051 81 000054 Cells for 4-radius circle 9x9 grid 0x0079 121 0000A5 Cells for 5-radius circle 11x11 grid 0x00a9 169 00011E Cells for 6-radius circle 13x13 grid 0x00e1 225 0001C7 Cells for 7-radius circle 15x15 grid END 0002A8 The data: 00 FF 00 FF 00 00 00 FF 00 FF FF 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 FF FF FF 00 00 00 FF FF FF FF FF 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 FF FF FF FF FF FF 00 00 00 00 00 FF FF FF FF FF 00 00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 FF FF FF FF FF 00 00 00 00 00 FF FF FF FF FF FF FF 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 FF FF FF FF FF A visual of the data Spoiler Value 00 = White = Reveal this tile Value FF = Grey = Don't reveal this tile There is a check that the game makes at address 0x0044e3ba to determine if the map reveal range is more than 7. If so, the game crashes with the message "Shroud circles only defined up to size 7." This much is probably already known. When loading a map, the game loads this file in these exact segments, storing them in these memory locations: Reference pointers to starting from 0x00547ff0 Location of data: 0 = 0x00548044 (1 byte data) (referenced by 0x00547ff0) 1 = 0x00548038 (9 byte data) (referenced by 0x00547ff4) 2 = 0x00548018 (25 byte data) (referenced by 0x00547ff8) 3 = 0x00517b60 (46 byte data) (referenced by 0x00547ffc) 4 = 0x00517b08 (81 byte data) (referenced by 0x00548000) 5 = 0x00517a88 (121 byte data) (referenced by 0x00548004) 6 = 0x005179d8 (169 byte data) (referenced by 0x00548008) 7 = 0x00517d00 (225 byte data) (referenced by 0x0054800c) With these locations, it may be possible to perform some modifications on the game executable to extend the maximum range of a reveal (either by Unit Sight or by Reveal Tile event). We will need: Modify the address of the reference pointers to support the same number of pointers as the desired range. Prepare memory locations for additional data. Have the game assign the reference pointers to the memory locations of additional data. Modify the function loading the file so it loads the required number of bytes to support the desired range. Supply the game with a large enough Circles.bin file to support the desired range. For a range up to 32 cells, 7690 bytes of data is needed. For the full range of 255, that would be 516130 bytes, too costly and impractical for a simple function. This is probably a case of trading space for processor efficiency by loading what is essentially a lookup table for each tile reveal instead of doing time-expensive math. This is a hypothesis, which has to be attempted and tested. Quote Link to comment Share on other sites More sharing options...
Fey Posted July 13, 2020 Share Posted July 13, 2020 Reveal the ENTIRE MAP!!! ...Without glitching! If you set a reveal map event to 0, it reveals the entire map but breaks the minimap unless you save and reload. Would it be much trouble to reveal a 128x128 map? Quote Link to comment Share on other sites More sharing options...
Cm_blast Posted July 13, 2020 Share Posted July 13, 2020 (edited) There is a oddly behaviour that I realize when revealing the map and saving-loading, not just the reveal map 0 that Fey it's talking about, but even on the vanilla ones. For some reason, the mini-radar varies if you reveal multiple areas with a reveal map of 7 (for example), save your map and reload. It slighly change. Could be that the map itself shows the X*X tile but the mini radar only shows the actual "circle" revealed withouth counting those grey areas? so saving/loading update the radar to add those gray portions into the mini radar as well (as how reveal map 0 reveal all the area but the radar does nothing) I don't know if turns into a usefull information for you or not. Edited July 13, 2020 by Cm_blast Quote Link to comment Share on other sites More sharing options...
lovalmidas Posted July 14, 2020 Author Share Posted July 14, 2020 (edited) For the reveal map 0 not updating the minimap, I found that the game updates the battlefield map and the shroud / minimap separately. For performance saving measures, the shroud and minimap is updated only within an NxN square centered around the reveal point (either a unit or a map location). For range 0, the square size is effectively 0x0 (or 1x1), meaning that effectively nothing is updated on the minimap. A quick fix would be to replace this logic with another that supplies the whole map dimensions. This fix may reduce performance, so I'll try to think of something to help branch this logic conditionally on range = 0. The results is sampled here, check the minimap: As for the minimap itself, this is interesting, but I have no in-depth knowledge of how saves recreate the minimap. Here is what I observed: Before save. (I am Ordos. Ordos structures to the north, Ordos units to the south. Map reveal triggers reveal Harkonnen base.) After loading Change map (dark grey is revealed before save, and shrouded after load) The battlefield itself follows the one after load. So the minimap is actually being revealed one tile beyond sight range into the shroud. Hmm... Edit: Added image for proof of concept Edited July 14, 2020 by lovalmidas 1 Quote Link to comment Share on other sites More sharing options...
Klofkac Posted July 18, 2020 Share Posted July 18, 2020 On 7/13/2020 at 8:15 PM, lovalmidas said: I apologize for spamming 'research topics'. I wanted to hijack an existing research thread for this file, but I didn't find a dedicated thread for it. The format of circles.bin is straight forward: Thanks for another good research! And by the way, I think it's definitely good practice to create a separate thread for individual file research, as this is much better organized than mixing up many different things in a single thread. I actually had an idea about purpose of this file, but did not bother about examining it deeply, as I felt it had quite low importance in terms of modding. But as discussed, having possibility to have circles with bigger radius and fixing the problem with radar minimap reveal is nice thing. On 7/13/2020 at 8:15 PM, lovalmidas said: (other values may have interesting results) Did you experiment with this? Anything interesting happens? Quote Link to comment Share on other sites More sharing options...
lovalmidas Posted July 21, 2020 Author Share Posted July 21, 2020 On 7/19/2020 at 4:59 AM, Klofkac said: Did you experiment with this? Anything interesting happens? I only tried hex value 0x11. And it only reveals the tile if there is an unrevealed tile in some of its 8 directions (which ones is not yet certain). In effect, a unit moving towards a blob of shroud to its west will not reveal them. It doesn't depend on the direction the unit is moving (although that does the impact the visuals as the map is only updated in a limited NxN square region around the unit), it seems to check the surrounding tiles to determine if it should uncover this tile. At some time I could generate some screenshot or video to illustrate this. Quote Link to comment Share on other sites More sharing options...
Klofkac Posted July 24, 2020 Share Posted July 24, 2020 On 7/22/2020 at 12:06 AM, lovalmidas said: I only tried hex value 0x11. And it only reveals the tile if there is an unrevealed tile in some of its 8 directions (which ones is not yet certain). In effect, a unit moving towards a blob of shroud to its west will not reveal them. It doesn't depend on the direction the unit is moving (although that does the impact the visuals as the map is only updated in a limited NxN square region around the unit), it seems to check the surrounding tiles to determine if it should uncover this tile. At some time I could generate some screenshot or video to illustrate this. Ok, I tried myself with various values, and the behavior is interesting, but I could not find the exact behavior mechanics. It also looks like the value is rather a bit field than a numeric value. For example using value 0xF0 behaved same as 0x00, only bits in the lower nibble had an special effect. Maybe you could take a look into code, how the game evaluates the value, if it performs any logical bit operations etc. Probably the other values than 0x00 and 0xFF was an unused feature. But anyway, I wonder if this is even anyhow useful and has any modding potential. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.