// parseStage2 is called by Parse to take advantage of defer unwinding. By // splitting the parsing we can easily obtain the locks we want and defer the // unlocking. This makes both Parse and parseStage2 very simple. func (p *Player) parseStage2(cmd *command.Command) (retry bool) { for _, l := range cmd.Locks { l.Lock() defer l.Unlock() } // If player moved before we locked we need to retry if !cmd.CanLock(p.Locate()) { return true } handled := p.Process(cmd) retry = cmd.LocksModified() if !handled && !retry { cmd.Respond("[RED]Eh?") } if !retry { cmd.Flush() } return }