Resumindo:
Use decodeInteger(forKey :) ao invés de decodeObject(forKey :).
Explicando:
Ao usar decodeObject(forKey :) para leitura/desserializar, ele retorna nulo (nil) por causa da sobrecarga de operador que é feita no momento da serialização/gravação com o método genérico encode(_: forKey :). No seu caso, o encode trata a variável happiness como um Int, pela definição dela, para depois gravar-lo como um tipo NSNumber, inferindo sobre o seu tipo, e não um NSObject. Após isso, você não pode ler/desserializa-lo como um Object (o que resultará em nulo/nil) e forçar o casting para Int (já que NSObject não é sua instância). Ou seja, temos dois erros.
Tem uma explicação boa sobre isso tudo neste artigo do stackoverflow, contudo, está em inglês: https://stackoverflow.com/questions/51751677/how-to-cast-from-int-to-nsnumber
Não é exatamente o que esta acontecendo com você, mas explica sobre essa problemática de encode/decode e casting.
Um livro muito bom que explica tudo no isso detalhe são os Programming Fundamentals with Swift, do Matt Neuberg.
Espero ter ajudado. Acabei estudando o assunto também. Obrigado!