Byte stores and field alignment
Where lbz pulled a byte out, stb puts one back, and the field's type still fixes the width. Take this color struct:
typedef struct { u8 r; u8 g; u8 b; u8 a; } Color;
Every field here is a single byte, in declaration order. A field's offset is its distance in bytes from the start of the struct. With no padding, r is 0, g is 1, b is 2, and a is 3.
The byte store is stb rS, offset(rA). Whatever displacement it carries names the field being written, so that offset tells you the target. Writing the final byte, at offset 3, gives:
stb r4, 3(r3)
blr
Going backward from any stb is the same counting exercise. Step through the struct one byte at a time until the running total hits the displacement, and you've found the field.
Mixed widths are where alignment bites. A u16 can't start on an odd offset, so the compiler pads to fix it. Declare { u8 flags; u16 hp; } and hp won't land at 1; it ends up at offset 2, with a hidden pad byte in front. Get those offsets right and your loads and stores fall into place.
Your task
With the Color struct above, write func_8010e818 to reproduce the target assembly.