It’s a case of jumping in face-first and figuring out how the code works - and asking questions along the way. It’s a tangled, gnarly mess, and there’s not a whole lot of code documentation at the moment.
Hopefully you pick an easy place to jump into the first time around, and also feel free to ask if something confuses you.
In that particular case… Well, I know that you get unhappy when you’re wet, so I’ll search for “WET” and hope there’s something that matches. Ah, MORALE_WET, exactly what I’m looking for. That’s added in… weather.cpp, in weather_effect:wet. Looking at the if statement, it appears to be PLAYER_OUTSIDE that’s controlling what you want. So, if I then look for what PLAYER_OUTSIDE means, it’s apparently a preprocessor #define that calls map::is_outside. So, I’ll look that function up, and… it uses outside_cache, a 2D array (I think… ew the low-level C). And that’s updated in map::build_outside_cache.
Now, looking at map::build_outside_cache, I don’t see any bugs in that function. So, I suspect the issue is either that the shelter kit terrain isn’t being properly marked as inside, OR the outside_cache array isn’t being refreshed in a case where it needs to be.
Another approach would be to test the tent as well. If the tent doesn’t have the same bug, then look for differences between the tent and the shelter kit, and that might yield results.
Does that step-by-step walkthrough of the debugging process help?