It's an LZS variant.
Code basically has two parts: Replace and Raw.
Raw code must be preceded by a length, which can be no greater than 127 bytes.
Replace code has two bytes each, the first being the length, and the second being how far back you have to seek. The length byte starts at 80 (to differentiate it from a Raw code command) and increments by 8 for every 1 byte. A code of 80 means that that 3 bytes must be read, and every 8 on top of that means an extra 1 byte. The seek byte counts back starting from just before the last byte written.
As a result, [80 00] would start from the last byte written and read off the next three (so theoretically, that would repeat the last byte three more times).
Replace codes can be put together without requiring Raw code inbetween: the [88 24 88 08] later in the file demonstrates this by taking the "[00 47 00]S" from one place in the file, and then immediately placing "onic" directly after it from another place in the file.
It's pretty straightforward. I also assume that a code of [00] means no Replace data, so that the first six bytes would be a 4-byte unknown, a [00] code, and a [12] meaning that the first set of raw bytes is 18 bytes long. But you'd have to play around with that to be sure.
Didn't look too difficult to me, so I'm surprised you had problems with it.