Interleaving the data isn’t a great idea, it’s better in this case to have seperate arrays for fire and obstacles, since different code is going to be acting on them.
We don’t need to try and round it up or down to bit boundaries, if 3 bits is enough we can just have three bits per tile, and bit-pack them.
I don’t know enough about the code to comment on that, but would it perhaps be easier to link fortification to the NPC camp system? You could designate tiles to be fortified and it’s level would be based on the level of your camp and the materials available/you designate, then you don’t have to worry about things lining up or only protecting on certain sides since it would all be system built. Hordes would either breach or be repelled based on the level of the fortification and the size of the horde.
It might even be worth separating barricading and fortifying. Barricading could just be fences, boarded up windows, concrete walls at higher levels, etc. then fortifying could include actual methods of killing zombies, traps, turrets, guard NPCs, etc. If a horde hits a barricade it either breaches or doesn’t, and nothing happens to the horde. If a horde hits a fortification that’s strong enough then the horde is wiped out, otherwise the fortification is damaged/destroyed (unless an existing barricade is strong enough.)
That’s probably far too complicated for the moment, but it might be worth considering for the future.