D2X-XL Worklog
Notes on features and problems from the development of D2X-XL, newest first.
Wall Collision Handling |
|
There was a problem with wall collision handling that had been haunting me well over a year. At certain locations I was able to drive the ship half into a wall when fiddling around with it a while. I could reproduce this with old program versions (very old - D2X-W32 1.6) as well as with D2X-Rebirth. I managed to fix this more or less, but recently it resurfaced unexpectedly when I was told that you could snatch powerups that should have been inaccessibly locked away behind grates or force fields. First I thought it was some problem with the powerup size, believing it got messed up when loading and using 3D powerup models, but that wasn't the case. When investigating in the matter, I soon found myself back at that dreaded wall handling problem. Arrrgh. After careful and long experimentation I found out how to reliably reproduce the problem. All that was needed was an angle between two walls and several small segments nearby so that the ship's center remained in a different segment than the wall it hit belonged to. Due to some inherent weakness of the related code the hit at the wall with such a constellation wasn't detected. If the ship now kept moving almost parallel to the wall it had hit, rounding problems rooted in Descent 2's archaic fixed floating point format lead to the program allowing the ship to slip further into the wall. Pivotal to this behaviour was that a wall hit was only registered when it occurred first - once the ship had penetrated into the wall, the code did not react properly any more. Here is a sketch to illustrate the problem:
To my great relief I found that a simple rearrangement of a some hit test math functions - leading to the program looking for hits in nearby segments too - solved the entire issue elegantly. One problem however remained: I could drive the ship on the edge of two walls with a very small angle between them, and it would penetrate that edge a bit, again allowing me to move the ship into one of these walls. Again, some rather extreme geometry, but that didn't make me any happier. A look into the code responsible for that revealed that a very big tolerance had been coded into detecting when the ship penetrated an edge (25% of the ship size - hey, that's a *tad* big, isn't it?). I decreased the value to 10%, and voilà: The problem was gone! Hooray! I just hope my changes won't have any other unpleasant side effects. Hm. |



