The action::state("something") is mostly meant as an ad-hoc way to get something up and running. It's pretty inefficient to check these states every tick. Cause the script has to pass the WASM boundary and serialization/deserialization has to happen.
You also get an ActionEvent if any action gets triggered. See https://docs.lotus-simulator.dev/en/rust/messages/
We are still working on how to nicely use the message system in Rust, hence we don't exactly "advertise" this way currently.
I personally can't say anything about the sounds, sorry.